2061 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			2061 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Collections;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Drawing.Text;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Indicates the Balloon tip position.
 | 
						|
	/// </summary>
 | 
						|
	public enum eTipPosition
 | 
						|
	{
 | 
						|
		/// <summary>
 | 
						|
		/// Tip is on the top.
 | 
						|
		/// </summary>
 | 
						|
		Top=0,
 | 
						|
		/// <summary>
 | 
						|
		/// Tip is on the left side.
 | 
						|
		/// </summary>
 | 
						|
		Left=1,
 | 
						|
		/// <summary>
 | 
						|
		/// Tip is on the right side.
 | 
						|
		/// </summary>
 | 
						|
		Right=2,
 | 
						|
		/// <summary>
 | 
						|
		/// Tip is on the bottom.
 | 
						|
		/// </summary>
 | 
						|
		Bottom=3
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Indicates the style of the balloon.
 | 
						|
	/// </summary>
 | 
						|
	public enum eBallonStyle
 | 
						|
	{
 | 
						|
		Balloon=0,
 | 
						|
		Alert=1,
 | 
						|
        Office2007Alert
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Indicates type of Alert animation performed when alert is displayed.
 | 
						|
	/// </summary>
 | 
						|
	public enum eAlertAnimation
 | 
						|
	{
 | 
						|
		/// <summary>
 | 
						|
		/// No animation take place when alert is displayed.
 | 
						|
		/// </summary>
 | 
						|
		None=0,
 | 
						|
		/// <summary>
 | 
						|
		/// Alert is animated from bottom to top. (Default)
 | 
						|
		/// </summary>
 | 
						|
		BottomToTop=1,
 | 
						|
		/// <summary>
 | 
						|
		/// Alert is animated from top to bottom.
 | 
						|
		/// </summary>
 | 
						|
		TopToBottom=2,
 | 
						|
		/// <summary>
 | 
						|
		/// Alert is animated from left to right.
 | 
						|
		/// </summary>
 | 
						|
		LeftToRight=3,
 | 
						|
		/// <summary>
 | 
						|
		/// Alert is animated from right to left.
 | 
						|
		/// </summary>
 | 
						|
		RightToLeft=4
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Delegate for custom paint event handler.
 | 
						|
	/// </summary>
 | 
						|
	public delegate void CustomPaintEventHandler(object sender, CustomPaintEventArgs e);
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Summary description for Balloon.
 | 
						|
	/// </summary>
 | 
						|
    [ToolboxItem(false), System.Runtime.InteropServices.ComVisible(false), Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design, Version= 2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
 | 
						|
	public class Balloon : System.Windows.Forms.Form
 | 
						|
	{
 | 
						|
		private System.ComponentModel.IContainer components;
 | 
						|
		#region Event Definition
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when background is redrawn.
 | 
						|
		/// </summary>
 | 
						|
		public event CustomPaintEventHandler PaintBackground;
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when caption image is redrawn.
 | 
						|
		/// </summary>
 | 
						|
		public event CustomPaintEventHandler PaintCaptionImage;
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when caption text is redrawn.
 | 
						|
		/// </summary>
 | 
						|
		public event CustomPaintEventHandler PaintCaptionText;
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when text is redrawn.
 | 
						|
		/// </summary>
 | 
						|
		public event CustomPaintEventHandler PaintText;
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when close button is clicked.
 | 
						|
		/// </summary>
 | 
						|
		public event EventHandler CloseButtonClick;
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when TipPosition property has changed.
 | 
						|
		/// </summary>
 | 
						|
		public event EventHandler TipPositionChanged;
 | 
						|
		#endregion
 | 
						|
 | 
						|
 | 
						|
		private int m_TipLength=16;
 | 
						|
		private int m_CornerSize=8;
 | 
						|
		private int m_TipOffset=32;
 | 
						|
		private eTipPosition m_TipPosition=eTipPosition.Top;
 | 
						|
 | 
						|
		private Color m_BackColor2=Color.Empty;
 | 
						|
		private int m_BackColorGradientAngle=90;
 | 
						|
 | 
						|
		private eBackgroundImagePosition m_BackgroundImagePosition=eBackgroundImagePosition.Stretch;
 | 
						|
		private int m_BackgroundImageAlpha=255;
 | 
						|
 | 
						|
		private Color m_BorderColor=SystemColors.InfoText;
 | 
						|
 | 
						|
		private bool m_ShowCloseButton=true;
 | 
						|
		private ImageButton m_CloseButton=null;
 | 
						|
 | 
						|
		private eBallonStyle m_Style=eBallonStyle.Balloon;
 | 
						|
 | 
						|
		private Image m_CloseButtonNormal=null, m_CloseButtonHot=null, m_CloseButtonPressed=null;
 | 
						|
		private Image m_CaptionImage=null;
 | 
						|
		private Icon m_CaptionIcon=null;
 | 
						|
		private Font m_CaptionFont=null;
 | 
						|
		private string m_CaptionText="";
 | 
						|
		private StringAlignment m_CaptionAlignment=StringAlignment.Near;
 | 
						|
		private Color m_CaptionColor=SystemColors.InfoText;
 | 
						|
 | 
						|
		private StringAlignment m_TextAlignment=StringAlignment.Near;
 | 
						|
		private StringAlignment m_TextLineAlignment=StringAlignment.Center;
 | 
						|
 | 
						|
		// Layout rectangles
 | 
						|
		private Rectangle m_CaptionImageRectangle=Rectangle.Empty;
 | 
						|
		private Rectangle m_CaptionRectangle=Rectangle.Empty;
 | 
						|
		private Rectangle m_TextRectangle=Rectangle.Empty;
 | 
						|
 | 
						|
		private bool m_AutoClose=true;
 | 
						|
		private int m_AutoCloseTimeOut=0;
 | 
						|
		private System.Windows.Forms.Timer m_Timer=null;
 | 
						|
 | 
						|
		const int IMAGETEXT_SPACING=4;
 | 
						|
		const int TEXTCLOSE_SPACING=4;
 | 
						|
		const int CAPTIONTEXT_VSPACING=1;
 | 
						|
		const int CAPTIONALERT_VSPACING=1;
 | 
						|
 | 
						|
		private Color m_BorderColor1=Color.FromArgb(241,239,226);
 | 
						|
		private Color m_BorderColor2=Color.White;
 | 
						|
		private Color m_BorderColor3=Color.FromArgb(236,233,216);
 | 
						|
		private Color m_BorderColor4=Color.FromArgb(172,168,153);
 | 
						|
		private Color m_BorderColor5=Color.FromArgb(113,111,100);
 | 
						|
 | 
						|
		private eAlertAnimation m_AlertAnimation=eAlertAnimation.BottomToTop;
 | 
						|
		private int m_AlertAnimationDuration=200;
 | 
						|
		private bool m_AnimationInProgress=false;
 | 
						|
        private bool m_AntiAlias = true;
 | 
						|
 | 
						|
		public Balloon()
 | 
						|
		{
 | 
						|
			CreateCloseButton();
 | 
						|
			//
 | 
						|
			// Required for Windows Form Designer support
 | 
						|
			//
 | 
						|
			InitializeComponent();
 | 
						|
			if(components==null)
 | 
						|
				this.components = new System.ComponentModel.Container();
 | 
						|
			m_CaptionFont=new Font(this.Font,FontStyle.Bold);
 | 
						|
 | 
						|
			this.SetStyle(ControlStyles.UserPaint,true);
 | 
						|
			this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
 | 
						|
			//this.SetStyle(ControlStyles.Opaque,true);
 | 
						|
			this.SetStyle(ControlStyles.ResizeRedraw,true);
 | 
						|
			this.SetStyle(DisplayHelp.DoubleBufferFlag,true);
 | 
						|
			this.SetStyle(ControlStyles.ContainerControl,true);
 | 
						|
		}
 | 
						|
 | 
						|
	    /// <summary>
 | 
						|
		/// Clean up any resources being used.
 | 
						|
		/// </summary>
 | 
						|
		protected override void Dispose( bool disposing )
 | 
						|
		{
 | 
						|
			DestroyAutoCloseTimer();
 | 
						|
			if( disposing )
 | 
						|
			{
 | 
						|
				if(components != null)
 | 
						|
				{
 | 
						|
					components.Dispose();
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
            if (BarUtilities.DisposeItemImages && !this.DesignMode)
 | 
						|
            {
 | 
						|
                BarUtilities.DisposeImage(ref m_CaptionIcon);
 | 
						|
                BarUtilities.DisposeImage(ref m_CaptionImage);
 | 
						|
                BarUtilities.DisposeImage(ref m_CloseButtonHot);
 | 
						|
                BarUtilities.DisposeImage(ref m_CloseButtonNormal);
 | 
						|
                BarUtilities.DisposeImage(ref m_CloseButtonPressed);
 | 
						|
            }
 | 
						|
			base.Dispose( disposing );
 | 
						|
		}
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether anti-alias smoothing is used while painting. Default value is false.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Browsable(true), Category("Appearance"), Description("Gets or sets whether anti-aliasing is used while painting.")]
 | 
						|
        public bool AntiAlias
 | 
						|
        {
 | 
						|
            get { return m_AntiAlias; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                m_AntiAlias = value;
 | 
						|
                this.Invalidate();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
		#region Windows Form Designer generated code
 | 
						|
		/// <summary>
 | 
						|
		/// Required method for Designer support - do not modify
 | 
						|
		/// the contents of this method with the code editor.
 | 
						|
		/// </summary>
 | 
						|
		private void InitializeComponent()
 | 
						|
		{
 | 
						|
			// 
 | 
						|
			// Balloon
 | 
						|
			// 
 | 
						|
			this.AccessibleRole = System.Windows.Forms.AccessibleRole.HelpBalloon;
 | 
						|
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
 | 
						|
            this.AutoScaleMode = AutoScaleMode.None;
 | 
						|
            this.BackColor = System.Drawing.SystemColors.Info; // ColorScheme.GetColor(0xFFFFBD);//
 | 
						|
			this.ClientSize = new System.Drawing.Size(192, 80);
 | 
						|
			this.ControlBox = false;
 | 
						|
			this.ForeColor = System.Drawing.SystemColors.InfoText;
 | 
						|
			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
 | 
						|
			this.MaximizeBox = false;
 | 
						|
			this.MinimizeBox = false;
 | 
						|
			this.Name = "Balloon";
 | 
						|
			this.ShowInTaskbar = false;
 | 
						|
			this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
 | 
						|
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		protected override void OnClick(EventArgs e)
 | 
						|
		{
 | 
						|
			if(m_ShowCloseButton && m_CloseButton.Bounds.Contains(this.PointToClient(Control.MousePosition)))
 | 
						|
				return;
 | 
						|
			base.OnClick(e);
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnPaint(PaintEventArgs e)
 | 
						|
		{
 | 
						|
            SmoothingMode sm = e.Graphics.SmoothingMode;
 | 
						|
            TextRenderingHint th = e.Graphics.TextRenderingHint;
 | 
						|
 | 
						|
            if (m_AntiAlias)
 | 
						|
            {
 | 
						|
                e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 | 
						|
                e.Graphics.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | 
						|
            }
 | 
						|
 | 
						|
			if(m_Style==eBallonStyle.Balloon)
 | 
						|
				PaintBalloon(e.Graphics);
 | 
						|
			else
 | 
						|
				PaintAlert(e.Graphics);
 | 
						|
 | 
						|
            e.Graphics.SmoothingMode = sm;
 | 
						|
            e.Graphics.TextRenderingHint = th;
 | 
						|
		}
 | 
						|
 | 
						|
		private void PaintAlert(Graphics g)
 | 
						|
		{
 | 
						|
			Rectangle client=this.GetAlertClientRect();
 | 
						|
			if(PaintBackground!=null)
 | 
						|
				PaintBackground(this,new CustomPaintEventArgs(g,client));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				PaintBackgroundInternal(g);
 | 
						|
                if (m_Style == eBallonStyle.Alert)
 | 
						|
                {
 | 
						|
                    // Paint Caption Background
 | 
						|
                    Rectangle rCap = client;
 | 
						|
                    rCap.Height = Math.Max(m_CaptionImageRectangle.Bottom, m_CaptionRectangle.Bottom) - rCap.Top;
 | 
						|
                    rCap.Height += CAPTIONALERT_VSPACING;
 | 
						|
                    if (rCap.Width > 0 && rCap.Height > 0)
 | 
						|
                    {
 | 
						|
                        using (LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(rCap, this.BackColor, m_BackColor2, m_BackColorGradientAngle))
 | 
						|
                        {
 | 
						|
                            Blend b = new Blend(4);
 | 
						|
                            b.Positions = new float[] { 0f, .5f, .5f, 1f };
 | 
						|
                            b.Factors = new float[] { 0f, 1f, 1f, 0f };
 | 
						|
                            gradient.Blend = b;
 | 
						|
                            g.FillRectangle(gradient, rCap);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
			}
 | 
						|
 | 
						|
			// Draw Border
 | 
						|
			Rectangle r=this.DisplayRectangle;
 | 
						|
            if (m_Style == eBallonStyle.Office2007Alert)
 | 
						|
            {
 | 
						|
                DisplayHelp.DrawRectangle(g, m_BorderColor, r);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                r.Width--;
 | 
						|
                r.Height--;
 | 
						|
                using (Pen pen = new Pen(m_BorderColor1, 1))
 | 
						|
                {
 | 
						|
                    g.DrawLine(pen, r.X, r.Y, r.Right, r.Y);
 | 
						|
                    g.DrawLine(pen, r.X, r.Y, r.X, r.Bottom);
 | 
						|
                    g.DrawLine(pen, r.X + 4, r.Bottom - 4, r.Right - 4, r.Bottom - 4);
 | 
						|
                    g.DrawLine(pen, r.Right - 4, r.Y + 4, r.Right - 4, r.Bottom - 4);
 | 
						|
                }
 | 
						|
                using (Pen pen = new Pen(m_BorderColor2, 1))
 | 
						|
                {
 | 
						|
                    g.DrawLine(pen, r.X + 1, r.Y + 1, r.Right - 1, r.Y + 1);
 | 
						|
                    g.DrawLine(pen, r.X + 1, r.Y + 1, r.X + 1, r.Bottom - 1);
 | 
						|
                    g.DrawLine(pen, r.X + 3, r.Bottom - 3, r.Right - 3, r.Bottom - 3);
 | 
						|
                    g.DrawLine(pen, r.Right - 3, r.Y + 3, r.Right - 3, r.Bottom - 3);
 | 
						|
                }
 | 
						|
                using (Pen pen = new Pen(m_BorderColor3, 1))
 | 
						|
                {
 | 
						|
                    g.DrawLine(pen, r.X + 2, r.Y + 2, r.Right - 2, r.Y + 2);
 | 
						|
                    g.DrawLine(pen, r.X + 2, r.Y + 2, r.X + 2, r.Bottom - 2);
 | 
						|
                    g.DrawLine(pen, r.X + 2, r.Bottom - 2, r.Right - 2, r.Bottom - 2);
 | 
						|
                    g.DrawLine(pen, r.Right - 2, r.Y + 2, r.Right - 2, r.Bottom - 2);
 | 
						|
                }
 | 
						|
                using (Pen pen = new Pen(m_BorderColor4, 1))
 | 
						|
                {
 | 
						|
                    g.DrawLine(pen, r.X + 3, r.Y + 3, r.Right - 3, r.Y + 3);
 | 
						|
                    g.DrawLine(pen, r.X + 3, r.Y + 3, r.X + 3, r.Bottom - 3);
 | 
						|
                    g.DrawLine(pen, r.X + 1, r.Bottom - 1, r.Right - 1, r.Bottom - 1);
 | 
						|
                    g.DrawLine(pen, r.Right - 1, r.Y + 1, r.Right - 1, r.Bottom - 1);
 | 
						|
                }
 | 
						|
                using (Pen pen = new Pen(m_BorderColor5, 1))
 | 
						|
                {
 | 
						|
                    g.DrawLine(pen, r.X + 4, r.Y + 4, r.Right - 4, r.Y + 4);
 | 
						|
                    g.DrawLine(pen, r.X + 4, r.Y + 4, r.X + 4, r.Bottom - 4);
 | 
						|
                    g.DrawLine(pen, r.X, r.Bottom, r.Right, r.Bottom);
 | 
						|
                    g.DrawLine(pen, r.Right, r.Y, r.Right, r.Bottom);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
	
 | 
						|
			if(m_CloseButton!=null)
 | 
						|
				m_CloseButton.Paint(g);
 | 
						|
 | 
						|
			if(PaintCaptionImage!=null)
 | 
						|
				PaintCaptionImage(this,new CustomPaintEventArgs(g,m_CaptionImageRectangle));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				CompositeImage image=this.ImageInternal;
 | 
						|
				if(image!=null && !m_CaptionImageRectangle.IsEmpty)
 | 
						|
					image.DrawImage(g,m_CaptionImageRectangle);
 | 
						|
			}
 | 
						|
 | 
						|
			if(PaintCaptionText!=null)
 | 
						|
				PaintCaptionText(this,new CustomPaintEventArgs(g,m_CaptionRectangle));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if(m_CaptionText!="" && !m_CaptionRectangle.IsEmpty)
 | 
						|
				{
 | 
						|
                    eTextFormat format = eTextFormat.Default | eTextFormat.WordBreak;
 | 
						|
                    if (m_CaptionAlignment == StringAlignment.Center)
 | 
						|
                        format |= eTextFormat.HorizontalCenter;
 | 
						|
                    else if (m_CaptionAlignment == StringAlignment.Far)
 | 
						|
                        format |= eTextFormat.Right;
 | 
						|
					Font font=m_CaptionFont;
 | 
						|
					if(font==null)
 | 
						|
						font=this.Font;
 | 
						|
                    if (_CaptionTextMarkup != null)
 | 
						|
                    {
 | 
						|
                        TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, m_CaptionColor, (this.RightToLeft == RightToLeft.Yes), r, true);
 | 
						|
                        _CaptionTextMarkup.Arrange(m_CaptionRectangle, d);
 | 
						|
                        _CaptionTextMarkup.Render(d);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
    					TextDrawing.DrawString(g, m_CaptionText, font, m_CaptionColor, m_CaptionRectangle, format);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if(PaintText!=null)
 | 
						|
				PaintText(this,new CustomPaintEventArgs(g,m_TextRectangle));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if(this.Text!="")
 | 
						|
				{
 | 
						|
                    eTextFormat format = eTextFormat.Default | eTextFormat.WordBreak;
 | 
						|
                    if (m_TextAlignment == StringAlignment.Center)
 | 
						|
                        format |= eTextFormat.HorizontalCenter;
 | 
						|
                    else if (m_TextAlignment == StringAlignment.Far)
 | 
						|
                        format |= eTextFormat.Right;
 | 
						|
                    if (m_TextLineAlignment == StringAlignment.Center)
 | 
						|
                        format |= eTextFormat.VerticalCenter;
 | 
						|
                    else if (m_TextLineAlignment == StringAlignment.Far)
 | 
						|
                        format |= eTextFormat.Bottom;
 | 
						|
                    if (_TextMarkup != null)
 | 
						|
                    {
 | 
						|
                        TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, this.ForeColor,
 | 
						|
                            (this.RightToLeft == RightToLeft.Yes), r, true);
 | 
						|
                        _TextMarkup.Arrange(m_TextRectangle, d);
 | 
						|
                        _TextMarkup.Render(d);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                        TextDrawing.DrawString(g, this.Text, this.Font, this.ForeColor, m_TextRectangle, format);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void PaintBalloon(Graphics g)
 | 
						|
		{
 | 
						|
            Rectangle r = new Rectangle(0, 0, this.Width, this.Height); //this.DisplayRectangle;
 | 
						|
			GraphicsPath path=this.GetBalloonPath(r);
 | 
						|
			if(PaintBackground!=null)
 | 
						|
				PaintBackground(this,new CustomPaintEventArgs(g,r));
 | 
						|
			else
 | 
						|
				PaintBackgroundInternal(g);
 | 
						|
 | 
						|
			using(Pen pen=new Pen(m_BorderColor,1))
 | 
						|
			{
 | 
						|
				pen.Alignment=PenAlignment.Inset;
 | 
						|
				g.DrawPath(pen,path);
 | 
						|
			}
 | 
						|
 | 
						|
			if(m_CloseButton!=null)
 | 
						|
				m_CloseButton.Paint(g);
 | 
						|
 | 
						|
			if(PaintCaptionImage!=null)
 | 
						|
				PaintCaptionImage(this,new CustomPaintEventArgs(g,m_CaptionImageRectangle));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				CompositeImage image=this.ImageInternal;
 | 
						|
				if(image!=null && !m_CaptionImageRectangle.IsEmpty)
 | 
						|
					image.DrawImage(g,m_CaptionImageRectangle);
 | 
						|
			}
 | 
						|
 | 
						|
			if(PaintCaptionText!=null)
 | 
						|
				PaintCaptionText(this,new CustomPaintEventArgs(g,m_CaptionRectangle));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if(m_CaptionText!="" && !m_CaptionRectangle.IsEmpty)
 | 
						|
				{
 | 
						|
                    eTextFormat format = eTextFormat.Default | TextDrawing.TranslateHorizontal(m_CaptionAlignment) | eTextFormat.WordBreak;
 | 
						|
                    Font font = m_CaptionFont;
 | 
						|
                    if (font == null)
 | 
						|
                        font = this.Font;
 | 
						|
 | 
						|
 | 
						|
				    if (_CaptionTextMarkup != null)
 | 
						|
				    {
 | 
						|
                        TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, m_CaptionColor, (this.RightToLeft == RightToLeft.Yes), r, true);
 | 
						|
                        _CaptionTextMarkup.Arrange(m_CaptionRectangle, d);
 | 
						|
                        _CaptionTextMarkup.Render(d);
 | 
						|
				    }
 | 
						|
                    else
 | 
						|
                        TextDrawing.DrawString(g, m_CaptionText, font, m_CaptionColor, m_CaptionRectangle, format);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if(PaintText!=null)
 | 
						|
				PaintText(this,new CustomPaintEventArgs(g,m_TextRectangle));
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if(this.Text!="")
 | 
						|
				{
 | 
						|
                    eTextFormat format = eTextFormat.Default | TextDrawing.TranslateHorizontal(m_TextAlignment) |
 | 
						|
                        TextDrawing.TranslateVertical(m_TextLineAlignment) | eTextFormat.WordBreak;
 | 
						|
				    if (_TextMarkup != null)
 | 
						|
				    {
 | 
						|
                        TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, this.ForeColor,
 | 
						|
                            (this.RightToLeft == RightToLeft.Yes), r, true);
 | 
						|
                        _TextMarkup.Arrange(m_TextRectangle, d);
 | 
						|
                        _TextMarkup.Render(d);
 | 
						|
				    }
 | 
						|
                    else
 | 
						|
    					TextDrawing.DrawString(g, this.Text, this.Font, this.ForeColor, m_TextRectangle, format);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnResize(EventArgs e)
 | 
						|
		{
 | 
						|
			base.OnResize(e);
 | 
						|
			if(!m_AnimationInProgress)
 | 
						|
				this.RecalcLayout();
 | 
						|
		}
 | 
						|
        private int _MinimumBalloonWidth = 180;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the minimum balloon width when auto sizing balloon. Default value is 180.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(180), Category("Appearance"), Description("Indicates minimum balloon width when auto sizing balloon.")]
 | 
						|
        public int MinimumBalloonWidth
 | 
						|
        {
 | 
						|
            get { return _MinimumBalloonWidth; }
 | 
						|
            set { _MinimumBalloonWidth = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        private TextMarkup.BodyElement _TextMarkup = null;
 | 
						|
        protected override void OnTextChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            string text = this.Text;
 | 
						|
 | 
						|
            if (_TextMarkup != null)
 | 
						|
            {
 | 
						|
                _TextMarkup.MouseLeave(this);
 | 
						|
                _TextMarkup.HyperLinkClick -= new EventHandler(TextMarkupLinkClicked);
 | 
						|
                _TextMarkup = null;
 | 
						|
            }
 | 
						|
 | 
						|
            if (TextMarkup.MarkupParser.IsMarkup(ref text))
 | 
						|
                _TextMarkup = TextMarkup.MarkupParser.Parse(text);
 | 
						|
 | 
						|
            if (_TextMarkup != null)
 | 
						|
            {
 | 
						|
                _TextMarkup.HyperLinkClick += new EventHandler(TextMarkupLinkClicked);
 | 
						|
            }
 | 
						|
            this.Invalidate();
 | 
						|
            base.OnTextChanged(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private void TextMarkupLinkClicked(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            TextMarkup.HyperLink link = sender as TextMarkup.HyperLink;
 | 
						|
            if (link != null)
 | 
						|
            {
 | 
						|
                OnMarkupLinkClick(new MarkupLinkClickEventArgs(link.Name, link.HRef));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when text markup link is clicked. Markup links can be created using "a" tag, for example:
 | 
						|
        /// <a name="MyLink">Markup link</a>
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs when text markup link is clicked. Markup links can be created using <a> tag.")]
 | 
						|
        public event MarkupLinkClickEventHandler MarkupLinkClick;
 | 
						|
 | 
						|
        protected virtual void OnMarkupLinkClick(MarkupLinkClickEventArgs e)
 | 
						|
        {
 | 
						|
            if (this.MarkupLinkClick != null)
 | 
						|
                MarkupLinkClick(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual Size ResizeMarkup(Graphics g, int containerWidth)
 | 
						|
        {
 | 
						|
            if (_TextMarkup != null)
 | 
						|
            {
 | 
						|
                Rectangle r= new Rectangle(0,0,containerWidth, 1);
 | 
						|
                TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
 | 
						|
                _TextMarkup.Measure(r.Size, d);
 | 
						|
                //_TextMarkup.Arrange(r, d);
 | 
						|
                return _TextMarkup.Bounds.Size;
 | 
						|
            }
 | 
						|
            return Size.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual Size ResizeCaptionMarkup(Graphics g, int containerWidth)
 | 
						|
        {
 | 
						|
            if (_CaptionTextMarkup != null)
 | 
						|
            {
 | 
						|
                Rectangle r = new Rectangle(0, 0, containerWidth, 1);
 | 
						|
                TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
 | 
						|
                _CaptionTextMarkup.Measure(r.Size, d);
 | 
						|
                //_TextMarkup.Arrange(r, d);
 | 
						|
                return _CaptionTextMarkup.Bounds.Size;
 | 
						|
            }
 | 
						|
            return Size.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Auto resize balloon to the content. Balloon width is calculated so image and caption text can fit in single line.
 | 
						|
		/// </summary>
 | 
						|
		public void AutoResize()
 | 
						|
		{
 | 
						|
            System.Drawing.Size newSize = new Size(Dpi.Width(_MinimumBalloonWidth), 0);
 | 
						|
			
 | 
						|
			Size strSize=Size.Empty;
 | 
						|
 | 
						|
			// Calculates caption text rectangle height
 | 
						|
			Font font=m_CaptionFont;
 | 
						|
			if(font==null)
 | 
						|
				font=this.Font;
 | 
						|
			Graphics g=this.CreateGraphics();
 | 
						|
			try
 | 
						|
			{
 | 
						|
			    if (_CaptionTextMarkup != null)
 | 
						|
			        strSize = ResizeCaptionMarkup(g, 800);
 | 
						|
                else
 | 
						|
                    strSize = TextDrawing.MeasureString(g,(m_CaptionText != "" ? m_CaptionText : " "), font);
 | 
						|
 | 
						|
                newSize.Width = Math.Max(newSize.Width, strSize.Width);
 | 
						|
				if(m_CloseButton!=null)
 | 
						|
					newSize.Width+=Dpi.Width(m_CloseButton.Size.Width);
 | 
						|
				else
 | 
						|
					newSize.Width+=Dpi.Width18;
 | 
						|
				newSize.Width+=TEXTCLOSE_SPACING;
 | 
						|
				
 | 
						|
				int imageHeight=0;
 | 
						|
				if(m_CaptionIcon!=null)
 | 
						|
				{
 | 
						|
					newSize.Width+=Dpi.Width(m_CaptionIcon.Width+IMAGETEXT_SPACING);
 | 
						|
                    imageHeight = Dpi.Height(m_CaptionIcon.Height);
 | 
						|
				}
 | 
						|
				else if(m_CaptionImage!=null)
 | 
						|
				{
 | 
						|
					newSize.Width+=Dpi.Width(m_CaptionImage.Width+IMAGETEXT_SPACING);
 | 
						|
                    imageHeight = Dpi.Height(m_CaptionImage.Height);
 | 
						|
				}
 | 
						|
 | 
						|
				newSize.Height+=Math.Max(imageHeight,strSize.Height);
 | 
						|
				newSize.Height+=IMAGETEXT_SPACING*2;
 | 
						|
 | 
						|
			    if (_TextMarkup == null)
 | 
						|
			        strSize = TextDrawing.MeasureString(g, (this.Text != "" ? this.Text : " "), this.Font, newSize.Width,
 | 
						|
			            eTextFormat.Default | eTextFormat.WordBreak);
 | 
						|
			    else
 | 
						|
			        strSize = ResizeMarkup(g, newSize.Width);
 | 
						|
 | 
						|
				newSize.Height+=strSize.Height;
 | 
						|
 | 
						|
				newSize.Width+=m_CornerSize*2;
 | 
						|
				newSize.Height+=m_CornerSize*2;
 | 
						|
				
 | 
						|
				if(m_Style==eBallonStyle.Balloon)
 | 
						|
				{
 | 
						|
					if(m_TipPosition==eTipPosition.Left || m_TipPosition==eTipPosition.Right)
 | 
						|
						newSize.Width+=Dpi.Width(m_TipLength);
 | 
						|
					else
 | 
						|
						newSize.Height+=Dpi.Height(m_TipLength);
 | 
						|
				}
 | 
						|
				else
 | 
						|
					newSize.Height+=(int)((float)newSize.Height*.3);
 | 
						|
			}
 | 
						|
			finally
 | 
						|
			{
 | 
						|
				g.Dispose();
 | 
						|
			}
 | 
						|
 | 
						|
			this.Size=newSize;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Recalculates layout of the balloon.
 | 
						|
		/// </summary>
 | 
						|
		public void RecalcLayout()
 | 
						|
		{
 | 
						|
			if(this.DisplayRectangle.Width==0 || this.DisplayRectangle.Height==0)
 | 
						|
				return;
 | 
						|
 | 
						|
		    Size closeButtonSize = Size.Empty;
 | 
						|
		    if (m_CloseButton != null)
 | 
						|
		        closeButtonSize = m_CloseButton.Size;
 | 
						|
		    if(m_Style==eBallonStyle.Balloon)
 | 
						|
			{
 | 
						|
				Rectangle client=new Rectangle(m_CornerSize/2,m_CornerSize/2,this.Width-m_CornerSize,this.Height-m_CornerSize);
 | 
						|
				if(m_TipPosition==eTipPosition.Bottom)
 | 
						|
					client.Height-=m_TipLength;
 | 
						|
				else if(m_TipPosition==eTipPosition.Left)
 | 
						|
				{
 | 
						|
					client.X+=m_TipLength;
 | 
						|
					client.Width-=m_TipLength;
 | 
						|
				}
 | 
						|
				else if(m_TipPosition==eTipPosition.Right)
 | 
						|
					client.Width-=m_TipLength;
 | 
						|
				else
 | 
						|
				{
 | 
						|
					// TOP
 | 
						|
					client.Y+=m_TipLength;
 | 
						|
					client.Height-=m_TipLength;
 | 
						|
				}
 | 
						|
 | 
						|
				System.Drawing.Size imageSize=System.Drawing.Size.Empty;
 | 
						|
				if(m_CaptionIcon!=null)
 | 
						|
					imageSize=Dpi.ImageSize(m_CaptionIcon.Size);
 | 
						|
				else if(m_CaptionImage!=null)
 | 
						|
					imageSize=Dpi.ImageSize(m_CaptionImage.Size);
 | 
						|
 | 
						|
				m_CaptionRectangle=client;
 | 
						|
				if(!imageSize.IsEmpty)
 | 
						|
				{
 | 
						|
					m_CaptionRectangle.X+=(imageSize.Width+IMAGETEXT_SPACING);
 | 
						|
					m_CaptionRectangle.Width-=(imageSize.Width+IMAGETEXT_SPACING);
 | 
						|
				}
 | 
						|
				
 | 
						|
				// Calculates position of the close button if visible
 | 
						|
				if(m_CloseButton!=null)
 | 
						|
				{
 | 
						|
                    m_CloseButton.Location = new Point(client.Right - closeButtonSize.Width, client.Top);
 | 
						|
					m_CaptionRectangle.Width-=(closeButtonSize.Width+TEXTCLOSE_SPACING);
 | 
						|
				}
 | 
						|
 | 
						|
				// Calculates caption text rectangle height
 | 
						|
				Font font=m_CaptionFont;
 | 
						|
				if(font==null)
 | 
						|
					font=this.Font;
 | 
						|
				Graphics g=this.CreateGraphics();
 | 
						|
				try
 | 
						|
				{
 | 
						|
                    eTextFormat format = eTextFormat.Default | eTextFormat.WordBreak;
 | 
						|
                    if (m_CaptionAlignment == StringAlignment.Center)
 | 
						|
                        format = eTextFormat.HorizontalCenter;
 | 
						|
                    else if (m_CaptionAlignment == StringAlignment.Far)
 | 
						|
                        format = eTextFormat.Right;
 | 
						|
				    Size strSize = Size.Empty;
 | 
						|
				    if (_CaptionTextMarkup != null)
 | 
						|
				        strSize = ResizeCaptionMarkup(g, m_CaptionRectangle.Width);
 | 
						|
                    else
 | 
						|
                    strSize = TextDrawing.MeasureString(g,(m_CaptionText!=""?m_CaptionText:" "),font,m_CaptionRectangle.Width,format);
 | 
						|
					m_CaptionRectangle.Height=strSize.Height;
 | 
						|
				}
 | 
						|
				finally
 | 
						|
				{
 | 
						|
					g.Dispose();
 | 
						|
				}
 | 
						|
 | 
						|
				// Calculates position of the image rectangle
 | 
						|
				if(!imageSize.IsEmpty)
 | 
						|
				{
 | 
						|
					m_CaptionImageRectangle=new Rectangle(client.X,client.Y,imageSize.Width,imageSize.Height);
 | 
						|
					if(m_CaptionRectangle.Height>imageSize.Height)
 | 
						|
						m_CaptionImageRectangle.Y+=(int)(m_CaptionRectangle.Height-imageSize.Height)/2;
 | 
						|
					else if(imageSize.Height>m_CaptionRectangle.Height)
 | 
						|
						m_CaptionRectangle.Y+=(int)(imageSize.Height-m_CaptionRectangle.Height)/2;
 | 
						|
 | 
						|
				}
 | 
						|
				else if(m_CloseButton!=null && closeButtonSize.Height>m_CaptionRectangle.Height)
 | 
						|
					m_CaptionRectangle.Y+=(int)(closeButtonSize.Height-m_CaptionRectangle.Height)/2;
 | 
						|
				
 | 
						|
				// Calculates the rectangle for balloon text
 | 
						|
				if(m_CaptionRectangle.Bottom>m_CaptionImageRectangle.Bottom)
 | 
						|
					m_TextRectangle=new Rectangle(client.X,m_CaptionRectangle.Bottom+CAPTIONTEXT_VSPACING,client.Width,client.Bottom-(m_CaptionRectangle.Bottom+CAPTIONTEXT_VSPACING));
 | 
						|
				else
 | 
						|
					m_TextRectangle=new Rectangle(client.X,m_CaptionImageRectangle.Bottom+CAPTIONTEXT_VSPACING,client.Width,client.Bottom-(m_CaptionImageRectangle.Bottom+CAPTIONTEXT_VSPACING));
 | 
						|
 | 
						|
				// Calculates and sets the balloon window region
 | 
						|
				GraphicsPath path=this.GetBalloonPath(this.DisplayRectangle);
 | 
						|
				GraphicsPath tmpPath = (GraphicsPath)path.Clone();
 | 
						|
				tmpPath.Widen(Pens.Black);
 | 
						|
				Region region = new Region(tmpPath);
 | 
						|
				region.Union(path);
 | 
						|
				this.Region=region;
 | 
						|
                path.Dispose();
 | 
						|
                tmpPath.Dispose();
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				Rectangle client=this.GetAlertClientRect();
 | 
						|
				System.Drawing.Size imageSize=System.Drawing.Size.Empty;
 | 
						|
 | 
						|
				if(m_CaptionIcon!=null)
 | 
						|
					imageSize=Dpi.ImageSize(m_CaptionIcon.Size);
 | 
						|
				else if(m_CaptionImage!=null)
 | 
						|
					imageSize=Dpi.ImageSize(m_CaptionImage.Size);
 | 
						|
 | 
						|
				m_CaptionRectangle=client;
 | 
						|
				if(!imageSize.IsEmpty)
 | 
						|
				{
 | 
						|
					m_CaptionRectangle.X+=(imageSize.Width+IMAGETEXT_SPACING*2);
 | 
						|
					m_CaptionRectangle.Width-=(imageSize.Width+IMAGETEXT_SPACING*2);
 | 
						|
				}
 | 
						|
				
 | 
						|
				// Calculates position of the close button if visible
 | 
						|
				if(m_CloseButton!=null)
 | 
						|
				{
 | 
						|
					m_CloseButton.Location=new Point(client.Right-m_CloseButton.Bounds.Width-CAPTIONALERT_VSPACING,client.Top);
 | 
						|
					m_CaptionRectangle.Width-=(closeButtonSize.Width+TEXTCLOSE_SPACING+CAPTIONALERT_VSPACING);
 | 
						|
				}
 | 
						|
 | 
						|
				// Calculates caption text rectangle height
 | 
						|
				Font font=m_CaptionFont;
 | 
						|
				if(font==null)
 | 
						|
					font=this.Font;
 | 
						|
				Graphics g=this.CreateGraphics();
 | 
						|
				try
 | 
						|
				{
 | 
						|
                    eTextFormat format = eTextFormat.Default | eTextFormat.WordBreak;
 | 
						|
                    if (m_CaptionAlignment == StringAlignment.Center)
 | 
						|
                        format = eTextFormat.HorizontalCenter;
 | 
						|
                    else if (m_CaptionAlignment == StringAlignment.Far)
 | 
						|
                        format = eTextFormat.Right;
 | 
						|
                    Size strSize = TextDrawing.MeasureString(g, (m_CaptionText != "" ? m_CaptionText : " "), font, m_CaptionRectangle.Width, format);
 | 
						|
					m_CaptionRectangle.Height=strSize.Height;
 | 
						|
				}
 | 
						|
				finally
 | 
						|
				{
 | 
						|
					g.Dispose();
 | 
						|
				}
 | 
						|
 | 
						|
				// Calculates position of the image rectangle
 | 
						|
				if(!imageSize.IsEmpty)
 | 
						|
				{
 | 
						|
					m_CaptionImageRectangle=new Rectangle(client.X+IMAGETEXT_SPACING,client.Y,imageSize.Width,imageSize.Height);
 | 
						|
					if(m_CaptionRectangle.Height>imageSize.Height)
 | 
						|
						m_CaptionImageRectangle.Y+=(int)(m_CaptionRectangle.Height-imageSize.Height)/2;
 | 
						|
					else if(imageSize.Height>m_CaptionRectangle.Height)
 | 
						|
					{
 | 
						|
						m_CaptionRectangle.Y+=(int)(imageSize.Height+-m_CaptionRectangle.Height)/2;
 | 
						|
					}
 | 
						|
 | 
						|
				}
 | 
						|
				else if(m_CloseButton!=null && closeButtonSize.Height>m_CaptionRectangle.Height)
 | 
						|
					m_CaptionRectangle.Y+=(int)(closeButtonSize.Height-m_CaptionRectangle.Height)/2;
 | 
						|
 | 
						|
				m_CaptionRectangle.Offset(0,CAPTIONALERT_VSPACING);
 | 
						|
				m_CaptionImageRectangle.Offset(0,CAPTIONALERT_VSPACING);
 | 
						|
 | 
						|
				if(m_CloseButton!=null)
 | 
						|
				{
 | 
						|
					m_CloseButton.Location=new Point(m_CloseButton.Location.X,m_CaptionRectangle.Y+(m_CaptionRectangle.Height-closeButtonSize.Height)/2);
 | 
						|
				}
 | 
						|
 | 
						|
				
 | 
						|
				// Calculates the rectangle for balloon text
 | 
						|
				if(m_CaptionRectangle.Bottom>m_CaptionImageRectangle.Bottom)
 | 
						|
					m_TextRectangle=new Rectangle(client.X,m_CaptionRectangle.Bottom+CAPTIONTEXT_VSPACING*4,client.Width,client.Bottom-(m_CaptionRectangle.Bottom+CAPTIONTEXT_VSPACING*4));
 | 
						|
				else
 | 
						|
					m_TextRectangle=new Rectangle(client.X,m_CaptionImageRectangle.Bottom+CAPTIONTEXT_VSPACING*4,client.Width,client.Bottom-(m_CaptionImageRectangle.Bottom+CAPTIONTEXT_VSPACING*4));
 | 
						|
 | 
						|
				this.Region=new Region(this.DisplayRectangle);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private Rectangle GetAlertClientRect()
 | 
						|
		{
 | 
						|
            Rectangle r = new Rectangle(0, 0, this.Width, this.Height); // this.DisplayRectangle;
 | 
						|
			r.Inflate(-4,-4);
 | 
						|
			return r;
 | 
						|
		}
 | 
						|
 | 
						|
		private GraphicsPath GetBalloonPath(Rectangle rect)
 | 
						|
		{
 | 
						|
			GraphicsPath path = new GraphicsPath();
 | 
						|
 | 
						|
			Rectangle clipBounds=rect;
 | 
						|
			Rectangle balloonBounds=clipBounds;
 | 
						|
			int cornerDiameter=m_CornerSize*2;
 | 
						|
			Matrix matrix=new Matrix();
 | 
						|
			Point[] anchorPoints=new Point[3];
 | 
						|
			int tipOffset=m_TipOffset;
 | 
						|
 | 
						|
			balloonBounds.Size=new Size(balloonBounds.Width-1,balloonBounds.Height-1);
 | 
						|
 | 
						|
			bool adjustOffset = false;
 | 
						|
			if(m_TipPosition==eTipPosition.Bottom)
 | 
						|
			{
 | 
						|
				adjustOffset=true;
 | 
						|
				matrix.Translate(balloonBounds.Width, balloonBounds.Height);
 | 
						|
				matrix.Rotate(180);
 | 
						|
			}
 | 
						|
            else if (m_TipPosition == eTipPosition.Left && this.RightToLeft == RightToLeft.No || 
 | 
						|
                m_TipPosition == eTipPosition.Right && this.RightToLeft == RightToLeft.Yes)
 | 
						|
			{
 | 
						|
				adjustOffset = true;
 | 
						|
				balloonBounds.Size=new Size(balloonBounds.Height, balloonBounds.Width);
 | 
						|
				matrix.Translate(0, balloonBounds.Width);
 | 
						|
				matrix.Rotate(-90);
 | 
						|
			}
 | 
						|
			else if(m_TipPosition==eTipPosition.Right && this.RightToLeft == RightToLeft.No ||
 | 
						|
                m_TipPosition == eTipPosition.Left && this.RightToLeft == RightToLeft.Yes)
 | 
						|
			{
 | 
						|
				balloonBounds.Size=new Size(balloonBounds.Height, balloonBounds.Width);
 | 
						|
				matrix.Translate(balloonBounds.Height, 0);
 | 
						|
				matrix.Rotate(90);
 | 
						|
			}
 | 
						|
 | 
						|
			int balloonEdgeCenter =((int)(balloonBounds.Width-(m_CornerSize*2))/2)+1;
 | 
						|
			int offsetFromEdge = m_CornerSize;
 | 
						|
			if(adjustOffset)
 | 
						|
			{
 | 
						|
				tipOffset=(balloonBounds.Width-(offsetFromEdge*2)-m_TipOffset)+1;
 | 
						|
			}
 | 
						|
			if(tipOffset<balloonEdgeCenter)
 | 
						|
			{
 | 
						|
				anchorPoints[0]=new Point(tipOffset+offsetFromEdge,balloonBounds.Y+m_TipLength);
 | 
						|
				anchorPoints[1]=new Point(tipOffset+offsetFromEdge,balloonBounds.Y);
 | 
						|
				anchorPoints[2]=new Point(tipOffset+m_TipLength+offsetFromEdge,balloonBounds.Y+m_TipLength);
 | 
						|
			} 
 | 
						|
			else if(tipOffset>balloonEdgeCenter)
 | 
						|
			{
 | 
						|
				anchorPoints[0]=new Point(tipOffset-m_TipLength+offsetFromEdge,balloonBounds.Y+m_TipLength);
 | 
						|
				anchorPoints[1]=new Point(tipOffset+offsetFromEdge,balloonBounds.Y);
 | 
						|
				anchorPoints[2]=new Point(tipOffset+offsetFromEdge,balloonBounds.Y+m_TipLength);
 | 
						|
			} 
 | 
						|
			else 
 | 
						|
			{
 | 
						|
				anchorPoints[0]=new Point(tipOffset-m_TipLength+offsetFromEdge,balloonBounds.Y+m_TipLength);
 | 
						|
				anchorPoints[1]=new Point(tipOffset+offsetFromEdge,balloonBounds.Y);
 | 
						|
				anchorPoints[2]=new Point(tipOffset+m_TipLength+offsetFromEdge,balloonBounds.Y+m_TipLength);
 | 
						|
			}
 | 
						|
 | 
						|
			path.AddArc(balloonBounds.Left,balloonBounds.Top+m_TipLength,cornerDiameter, cornerDiameter,180, 90);
 | 
						|
 | 
						|
			path.AddLine(anchorPoints[0],anchorPoints[1]);
 | 
						|
			path.AddLine(anchorPoints[1],anchorPoints[2]);
 | 
						|
 | 
						|
			path.AddArc(balloonBounds.Width-cornerDiameter,balloonBounds.Top+m_TipLength,cornerDiameter, cornerDiameter, -90, 90);
 | 
						|
			path.AddArc(balloonBounds.Width-cornerDiameter,balloonBounds.Bottom-cornerDiameter,cornerDiameter, cornerDiameter, 0, 90);
 | 
						|
			path.AddArc(balloonBounds.Left, balloonBounds.Bottom-cornerDiameter,cornerDiameter, cornerDiameter, 90, 90);
 | 
						|
 | 
						|
			path.CloseFigure();
 | 
						|
				
 | 
						|
			path.Transform(matrix);
 | 
						|
			
 | 
						|
			return path;
 | 
						|
		}
 | 
						|
 | 
						|
		private void PaintBackgroundInternal(Graphics g)
 | 
						|
		{
 | 
						|
			Rectangle r=this.ClientRectangle;
 | 
						|
			if(r.Width==0 || r.Height==0)
 | 
						|
				return;
 | 
						|
 | 
						|
			if(m_BackColor2.IsEmpty)
 | 
						|
			{
 | 
						|
				using(SolidBrush brush=new SolidBrush(this.BackColor))
 | 
						|
					g.FillRectangle(brush,r);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				using(LinearGradientBrush gradient=BarFunctions.CreateLinearGradientBrush(r,this.BackColor,m_BackColor2,m_BackColorGradientAngle))
 | 
						|
				{
 | 
						|
					if(m_Style==eBallonStyle.Alert)
 | 
						|
					{
 | 
						|
						Blend b=new Blend(4);
 | 
						|
						b.Positions=new float[]{0f,.25f,.4f,.5f,.5f,.85f,.85f,1f};
 | 
						|
						b.Factors=new float[] {0f,1f,1f,0f,0f,0f,0f,1f};
 | 
						|
						gradient.Blend=b;
 | 
						|
					}
 | 
						|
					g.FillRectangle(gradient,r);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if(this.BackgroundImage==null)
 | 
						|
				return;
 | 
						|
 | 
						|
//			System.Drawing.Imaging.ImageAttributes imageAtt=null;
 | 
						|
//			
 | 
						|
//			if(m_BackgroundImageAlpha!=255)
 | 
						|
//			{
 | 
						|
//				System.Drawing.Imaging.ColorMatrix colorMatrix=new System.Drawing.Imaging.ColorMatrix();
 | 
						|
//				colorMatrix.Matrix33=255-m_BackgroundImageAlpha;
 | 
						|
//				imageAtt=new System.Drawing.Imaging.ImageAttributes();
 | 
						|
//				imageAtt.SetColorMatrix(colorMatrix,System.Drawing.Imaging.ColorMatrixFlag.Default,System.Drawing.Imaging.ColorAdjustType.Bitmap);
 | 
						|
//			}
 | 
						|
 | 
						|
			BarFunctions.PaintBackgroundImage(g,r,this.BackgroundImage,m_BackgroundImagePosition,m_BackgroundImageAlpha);
 | 
						|
 | 
						|
//			switch(m_BackgroundImagePosition)
 | 
						|
//			{
 | 
						|
//				case eBackgroundImagePosition.Stretch:
 | 
						|
//				{
 | 
						|
//					if(imageAtt!=null)
 | 
						|
//						g.DrawImage(this.BackgroundImage,r,0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel,imageAtt);
 | 
						|
//					else
 | 
						|
//						g.DrawImage(this.BackgroundImage,r,0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel);
 | 
						|
//					break;
 | 
						|
//				}
 | 
						|
//				case eBackgroundImagePosition.Center:
 | 
						|
//				{
 | 
						|
//					Rectangle destRect=new Rectangle(r.X,r.Y,this.BackgroundImage.Width,this.BackgroundImage.Height);
 | 
						|
//					if(r.Width>this.BackgroundImage.Width)
 | 
						|
//						destRect.X+=(r.Width-this.BackgroundImage.Width)/2;
 | 
						|
//					if(r.Height>this.BackgroundImage.Height)
 | 
						|
//						destRect.Y+=(r.Height-this.BackgroundImage.Height)/2;
 | 
						|
//					if(imageAtt!=null)
 | 
						|
//						g.DrawImage(this.BackgroundImage,destRect,0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel,imageAtt);
 | 
						|
//					else
 | 
						|
//						g.DrawImage(this.BackgroundImage,destRect,0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel);
 | 
						|
//					break;
 | 
						|
//				}
 | 
						|
//				case eBackgroundImagePosition.TopLeft:
 | 
						|
//				case eBackgroundImagePosition.TopRight:
 | 
						|
//				case eBackgroundImagePosition.BottomLeft:
 | 
						|
//				case eBackgroundImagePosition.BottomRight:
 | 
						|
//				{
 | 
						|
//					Rectangle destRect=new Rectangle(r.X,r.Y,this.BackgroundImage.Width,this.BackgroundImage.Height);
 | 
						|
//					if(m_BackgroundImagePosition==eBackgroundImagePosition.TopRight)
 | 
						|
//						destRect.X=r.Right-this.BackgroundImage.Width;
 | 
						|
//					else if(m_BackgroundImagePosition==eBackgroundImagePosition.BottomLeft)
 | 
						|
//						destRect.Y=r.Bottom-this.BackgroundImage.Height;
 | 
						|
//					else if(m_BackgroundImagePosition==eBackgroundImagePosition.BottomRight)
 | 
						|
//					{
 | 
						|
//						destRect.Y=r.Bottom-this.BackgroundImage.Height;
 | 
						|
//						destRect.X=r.Right-this.BackgroundImage.Width;
 | 
						|
//					}
 | 
						|
//
 | 
						|
//					if(imageAtt!=null)
 | 
						|
//						g.DrawImage(this.BackgroundImage,destRect,0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel,imageAtt);
 | 
						|
//					else
 | 
						|
//						g.DrawImage(this.BackgroundImage,destRect,0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel);
 | 
						|
//					break;
 | 
						|
//				}
 | 
						|
//				case eBackgroundImagePosition.Tile:
 | 
						|
//				{
 | 
						|
//					if(imageAtt!=null)
 | 
						|
//					{
 | 
						|
//						if(r.Width>this.BackgroundImage.Width || r.Height>this.BackgroundImage.Height)
 | 
						|
//						{
 | 
						|
//							int x=r.X,y=r.Y;
 | 
						|
//							while(y<r.Bottom)
 | 
						|
//							{
 | 
						|
//								while(x<r.Right)
 | 
						|
//								{
 | 
						|
//									Rectangle destRect=new Rectangle(x,y,this.BackgroundImage.Width,this.BackgroundImage.Height);
 | 
						|
//									if(destRect.Right>r.Right)
 | 
						|
//										destRect.Width=destRect.Width-(destRect.Right-r.Right);
 | 
						|
//									if(destRect.Bottom>r.Bottom)
 | 
						|
//										destRect.Height=destRect.Height-(destRect.Bottom-r.Bottom);
 | 
						|
//									g.DrawImage(this.BackgroundImage,destRect,0,0,destRect.Width,destRect.Height,GraphicsUnit.Pixel,imageAtt);
 | 
						|
//									x+=this.BackgroundImage.Width;
 | 
						|
//								}
 | 
						|
//								x=r.X;
 | 
						|
//								y+=this.BackgroundImage.Height;
 | 
						|
//							}
 | 
						|
//						}
 | 
						|
//						else
 | 
						|
//						{
 | 
						|
//							g.DrawImage(this.BackgroundImage,new Rectangle(0,0,this.BackgroundImage.Width,this.BackgroundImage.Height),0,0,this.BackgroundImage.Width,this.BackgroundImage.Height,GraphicsUnit.Pixel,imageAtt);
 | 
						|
//						}
 | 
						|
//					}
 | 
						|
//					else
 | 
						|
//					{
 | 
						|
//						TextureBrush brush=new TextureBrush(this.BackgroundImage); //,r);
 | 
						|
//						brush.WrapMode=System.Drawing.Drawing2D.WrapMode.Tile;
 | 
						|
//						g.FillRectangle(brush,r);
 | 
						|
//						brush.Dispose();
 | 
						|
//					}
 | 
						|
//					break;
 | 
						|
//				}
 | 
						|
//			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the target gradient background color.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates the target gradient background color."),Category("Style")]
 | 
						|
		public Color BackColor2
 | 
						|
		{
 | 
						|
			get {return m_BackColor2;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_BackColor2=value;
 | 
						|
				if(this.DesignMode)
 | 
						|
					this.Refresh();
 | 
						|
			}
 | 
						|
		}
 | 
						|
		[Browsable(false),EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public bool ShouldSerializeBackColor2()
 | 
						|
		{
 | 
						|
			return !m_BackColor2.IsEmpty;
 | 
						|
		}
 | 
						|
		[Browsable(false),EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public void ResetBackColor2()
 | 
						|
		{
 | 
						|
			m_BackColor2=Color.Empty;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets gradient fill angle.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates gradient fill angle."),Category("Style"),DefaultValue(90)]
 | 
						|
		public int BackColorGradientAngle
 | 
						|
		{
 | 
						|
			get {return m_BackColorGradientAngle;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(value!=m_BackColorGradientAngle)
 | 
						|
				{
 | 
						|
					m_BackColorGradientAngle=value;
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		/// <summary>
 | 
						|
		/// Specifies the transparency of background image.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),DevCoBrowsable(true),Category("Appearance"),DefaultValue(255),Description("Specifies the transparency of background image.")]
 | 
						|
		public int BackgroundImageAlpha
 | 
						|
		{
 | 
						|
			get {return m_BackgroundImageAlpha;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(value<0)
 | 
						|
					value=0;
 | 
						|
				else if(value>255)
 | 
						|
					value=255;
 | 
						|
				if(m_BackgroundImageAlpha!=value)
 | 
						|
				{
 | 
						|
					m_BackgroundImageAlpha=value;
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		/// <summary>
 | 
						|
		/// Specifies background image position when container is larger than image.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),DevCoBrowsable(true),Category("Appearance"),DefaultValue(eBackgroundImagePosition.Stretch),Description("Specifies background image position when container is larger than image.")]
 | 
						|
		public eBackgroundImagePosition BackgroundImagePosition
 | 
						|
		{
 | 
						|
			get {return m_BackgroundImagePosition;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(m_BackgroundImagePosition!=value)
 | 
						|
				{
 | 
						|
					m_BackgroundImagePosition=value;
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the border color..
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates border color."),Category("Style")]
 | 
						|
		public Color BorderColor
 | 
						|
		{
 | 
						|
			get {return m_BorderColor;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_BorderColor=value;
 | 
						|
				if(this.DesignMode)
 | 
						|
					this.Refresh();
 | 
						|
			}
 | 
						|
		}
 | 
						|
		[Browsable(false),EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public bool ShouldSerializeBorderColor()
 | 
						|
		{
 | 
						|
			return m_BorderColor!=SystemColors.InfoText;
 | 
						|
		}
 | 
						|
		[Browsable(false),EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public void ResetBorderColor()
 | 
						|
		{
 | 
						|
			m_BorderColor=SystemColors.InfoText;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Specifies balloon style.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),DevCoBrowsable(true),Category("Style"),DefaultValue(eBallonStyle.Balloon),Description("Specifies balloon style.")]
 | 
						|
		public eBallonStyle Style
 | 
						|
		{
 | 
						|
			get {return m_Style;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_Style=value;
 | 
						|
				if(m_Style==eBallonStyle.Alert)
 | 
						|
				{
 | 
						|
					this.BackColor=Color.FromArgb(207,221,244);
 | 
						|
					this.BackColor2=Color.White;
 | 
						|
					this.ForeColor=Color.FromArgb(102,114,196);
 | 
						|
					m_TextAlignment=StringAlignment.Center;
 | 
						|
				}
 | 
						|
                else if (m_Style == eBallonStyle.Office2007Alert)
 | 
						|
                {
 | 
						|
                    Office2007ColorTable ct = GetOffice2007ColorTable();
 | 
						|
                    ColorScheme cs = ct.LegacyColors;
 | 
						|
                    if (ct.SuperTooltip.BackgroundColors.IsEmpty)
 | 
						|
                    {
 | 
						|
                        this.BackColor = cs.PanelBackground;
 | 
						|
                        this.BackColor2 = cs.PanelBackground2;
 | 
						|
                        this.ForeColor = cs.PanelText;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        this.BackColor = ct.SuperTooltip.BackgroundColors.Start;
 | 
						|
                        this.BackColor2 = ct.SuperTooltip.BackgroundColors.End;
 | 
						|
                        this.ForeColor = ct.SuperTooltip.TextColor;
 | 
						|
                    }
 | 
						|
                    m_BorderColor = cs.PanelBorder;
 | 
						|
                    m_TextAlignment = StringAlignment.Near;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    m_TextAlignment = StringAlignment.Near;
 | 
						|
                    m_BorderColor = SystemColors.InfoText;
 | 
						|
                }
 | 
						|
                if(m_ShowCloseButton)
 | 
						|
				    this.CreateCloseButton();
 | 
						|
				this.RecalcLayout();
 | 
						|
				if(this.DesignMode)
 | 
						|
					this.Refresh();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        private Office2007ColorTable GetOffice2007ColorTable()
 | 
						|
        {
 | 
						|
            Office2007Renderer r = GlobalManager.Renderer as Office2007Renderer;
 | 
						|
            if (r != null)
 | 
						|
                return r.ColorTable;
 | 
						|
            return new Office2007ColorTable();
 | 
						|
        }
 | 
						|
 | 
						|
		protected override void OnMouseDown(MouseEventArgs e)
 | 
						|
		{
 | 
						|
			base.OnMouseDown(e);
 | 
						|
			if(m_CloseButton!=null)
 | 
						|
				m_CloseButton.OnMouseDown(e);
 | 
						|
			if(this.Focused)
 | 
						|
				this.Focus();
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnMouseMove(MouseEventArgs e)
 | 
						|
		{
 | 
						|
			base.OnMouseMove(e);
 | 
						|
			if(m_CloseButton!=null)
 | 
						|
				m_CloseButton.OnMouseMove(e);
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnMouseUp(MouseEventArgs e)
 | 
						|
		{
 | 
						|
			base.OnMouseUp(e);
 | 
						|
			if(m_CloseButton!=null)
 | 
						|
				m_CloseButton.OnMouseUp(e);
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnMouseLeave(EventArgs e)
 | 
						|
		{
 | 
						|
			base.OnMouseLeave(e);
 | 
						|
			if(m_CloseButton!=null)
 | 
						|
				m_CloseButton.OnMouseLeave(e);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets whether the Close button is displayed.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates whether the Close button is displayed."),Category("Behavior"),DefaultValue(true)]
 | 
						|
		public bool ShowCloseButton
 | 
						|
		{
 | 
						|
			get {return m_ShowCloseButton;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(value!=m_ShowCloseButton)
 | 
						|
				{
 | 
						|
					m_ShowCloseButton=value;
 | 
						|
					OnShowCloseButtonChanged();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void OnShowCloseButtonChanged()
 | 
						|
		{
 | 
						|
			if(m_ShowCloseButton)
 | 
						|
			{
 | 
						|
				CreateCloseButton();
 | 
						|
				RecalcLayout();
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				m_CloseButton=null;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void CreateCloseButton()
 | 
						|
		{
 | 
						|
            if (m_CloseButtonNormal != null)
 | 
						|
            {
 | 
						|
                m_CloseButton = new ImageButton(this, new Rectangle(0, 0, Dpi.Width(m_CloseButtonNormal.Width), Dpi.Height(m_CloseButtonNormal.Height)));
 | 
						|
                if (m_CloseButton.Normal != null)
 | 
						|
                {
 | 
						|
                    m_CloseButton.Normal.Dispose();
 | 
						|
                    m_CloseButton.Normal = null;
 | 
						|
                }
 | 
						|
                m_CloseButton.Normal = m_CloseButtonNormal;
 | 
						|
                if (m_CloseButton.Hover != null)
 | 
						|
                {
 | 
						|
                    m_CloseButton.Hover.Dispose();
 | 
						|
                    m_CloseButton.Hover = null;
 | 
						|
                }
 | 
						|
                m_CloseButton.Hover = m_CloseButtonHot;
 | 
						|
                if (m_CloseButton.Pressed != null)
 | 
						|
                {
 | 
						|
                    m_CloseButton.Pressed.Dispose();
 | 
						|
                    m_CloseButton.Pressed = null;
 | 
						|
                }
 | 
						|
                m_CloseButton.Pressed = m_CloseButtonPressed;
 | 
						|
            }
 | 
						|
            else // Default Image Size is 18x18
 | 
						|
            {
 | 
						|
                if (m_Style == eBallonStyle.Balloon)
 | 
						|
                {
 | 
						|
                    m_CloseButton = new ImageButton(this, new Rectangle(0, 0, Dpi.Width18, Dpi.Height18));
 | 
						|
                    m_CloseButton.Normal = BarFunctions.LoadBitmap("BalloonImages.BalloonNormal.png");
 | 
						|
                    m_CloseButton.Hover = BarFunctions.LoadBitmap("BalloonImages.BalloonHot.png");
 | 
						|
                    m_CloseButton.Pressed = BarFunctions.LoadBitmap("BalloonImages.BalloonPress.png");
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    m_CloseButton = new ImageButton(this, new Rectangle(0, 0, Dpi.Width13, Dpi.Height13));
 | 
						|
                    m_CloseButton.Normal = BarFunctions.LoadBitmap("BalloonImages.AlertNormal.png");
 | 
						|
                    m_CloseButton.Hover = BarFunctions.LoadBitmap("BalloonImages.AlertHot.png");
 | 
						|
                    m_CloseButton.Pressed = BarFunctions.LoadBitmap("BalloonImages.AlertPress.png");
 | 
						|
                }
 | 
						|
            }
 | 
						|
			m_CloseButton.Click+=new EventHandler(this.CloseButtonClickInternal);
 | 
						|
		}
 | 
						|
 | 
						|
		private void CloseButtonClickInternal(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			if(CloseButtonClick!=null)
 | 
						|
				CloseButtonClick(this,new EventArgs());
 | 
						|
			if(m_AutoClose)
 | 
						|
			{
 | 
						|
				this.Hide();
 | 
						|
				this.Close();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the animation type used to display Alert type balloon.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Gets or sets the animation type used to display Alert type balloon."),Category("Behavior"),DefaultValue(eAlertAnimation.BottomToTop)]
 | 
						|
		public eAlertAnimation AlertAnimation
 | 
						|
		{
 | 
						|
			get {return m_AlertAnimation;}
 | 
						|
			set {m_AlertAnimation=value;}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the total time in milliseconds alert animation takes.
 | 
						|
		/// Default value is 200.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Gets or sets the total time in milliseconds alert animation takes."),Category("Behavior"),DefaultValue(200)]
 | 
						|
		public int AlertAnimationDuration
 | 
						|
		{
 | 
						|
			get {return m_AlertAnimationDuration;}
 | 
						|
			set {m_AlertAnimationDuration=value;}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets whether balloon will close automatically when user click the close button.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates whether balloon will close automatically when user click the close button."),Category("Behavior"),DefaultValue(true)]
 | 
						|
		public bool AutoClose
 | 
						|
		{
 | 
						|
			get {return m_AutoClose;}
 | 
						|
			set {m_AutoClose=value;}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets time period in seconds after balloon closes automatically.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates time period in seconds after balloon closes automatically."),Category("Behavior"),DefaultValue(0)]
 | 
						|
		public int AutoCloseTimeOut
 | 
						|
		{
 | 
						|
			get {return m_AutoCloseTimeOut;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_AutoCloseTimeOut=value;
 | 
						|
				OnAutoCloseTimeOutChanged();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected void OnAutoCloseTimeOutChanged()
 | 
						|
		{
 | 
						|
			if(m_AutoCloseTimeOut>0 && !this.DesignMode)
 | 
						|
			{
 | 
						|
				if(m_Timer==null)
 | 
						|
					m_Timer=new System.Windows.Forms.Timer(components);
 | 
						|
				m_Timer.Enabled=false;
 | 
						|
				m_Timer.Interval=m_AutoCloseTimeOut*1000;
 | 
						|
				m_Timer.Tick+=new EventHandler(this.AutoCloseTimeOutEllapsed);
 | 
						|
				if(this.Visible)
 | 
						|
				{
 | 
						|
					m_Timer.Enabled=true;
 | 
						|
					m_Timer.Start();
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				DestroyAutoCloseTimer();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual void AutoCloseTimeOutEllapsed(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			if(this.IsDisposed)
 | 
						|
				return;
 | 
						|
			DestroyAutoCloseTimer();
 | 
						|
			this.Hide();
 | 
						|
			this.Close();
 | 
						|
		}
 | 
						|
 | 
						|
		private void DestroyAutoCloseTimer()
 | 
						|
		{
 | 
						|
			if(m_Timer!=null)
 | 
						|
			{
 | 
						|
				m_Timer.Enabled=false;
 | 
						|
				m_Timer.Tick-=new EventHandler(this.AutoCloseTimeOutEllapsed);
 | 
						|
				components.Remove(m_Timer);
 | 
						|
				m_Timer.Dispose();
 | 
						|
				m_Timer=null;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnVisibleChanged(EventArgs e)
 | 
						|
		{
 | 
						|
			base.OnVisibleChanged(e);
 | 
						|
			if(this.Visible)
 | 
						|
			{
 | 
						|
				if(m_Timer!=null && !m_Timer.Enabled)
 | 
						|
				{
 | 
						|
					m_Timer.Enabled=true;
 | 
						|
					m_Timer.Start();
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if(m_Timer!=null && m_Timer.Enabled)
 | 
						|
				{
 | 
						|
					m_Timer.Stop();
 | 
						|
					m_Timer.Enabled=false;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the custom image for Close Button.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true),Description("Indicates custom image for Close Button."),Category("Appearance")]
 | 
						|
		public Image CloseButtonNormal
 | 
						|
		{
 | 
						|
			get {return m_CloseButtonNormal;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CloseButtonNormal!=value)
 | 
						|
				{
 | 
						|
					m_CloseButtonNormal=value;
 | 
						|
					OnShowCloseButtonChanged();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the custom image for Close Button when mouse is over the button.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true),Description("Indicates custom image for Close Button when mouse is over the button."),Category("Appearance"),DefaultValue(null)]
 | 
						|
		public Image CloseButtonHot
 | 
						|
		{
 | 
						|
			get {return m_CloseButtonHot;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CloseButtonHot!=value)
 | 
						|
				{
 | 
						|
					m_CloseButtonHot=value;
 | 
						|
					OnShowCloseButtonChanged();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the custom image for Close Button when button is pressed.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true),Description("Indicates custom image for Close Button when button is pressed."),Category("Appearance"),DefaultValue(null)]
 | 
						|
		public Image CloseButtonPressed
 | 
						|
		{
 | 
						|
			get {return m_CloseButtonPressed;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CloseButtonPressed!=value)
 | 
						|
				{
 | 
						|
					m_CloseButtonPressed=value;
 | 
						|
					OnShowCloseButtonChanged();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the Caption image.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true),Description("Indicates Caption image."),Category("Appearance"),DefaultValue(null)]
 | 
						|
		public Image CaptionImage
 | 
						|
		{
 | 
						|
			get {return m_CaptionImage;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CaptionImage!=value)
 | 
						|
				{
 | 
						|
					m_CaptionImage=value;
 | 
						|
					this.RecalcLayout();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the Caption icon. Icon is used to provide support for alpha-blended images in caption.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates Caption icon. Icon is used to provide support for alpha-blended images in caption."),Category("Appearance"),DefaultValue(null)]
 | 
						|
		public Icon CaptionIcon
 | 
						|
		{
 | 
						|
			get {return m_CaptionIcon;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CaptionIcon!=value)
 | 
						|
				{
 | 
						|
					m_CaptionIcon=value;
 | 
						|
					this.RecalcLayout();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private CompositeImage ImageInternal
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				if(m_CaptionIcon!=null)
 | 
						|
					return new CompositeImage(m_CaptionIcon,false);
 | 
						|
				else if(m_CaptionImage!=null)
 | 
						|
					return new CompositeImage(m_CaptionImage,false);
 | 
						|
				return null;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the Caption font.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates Caption font."),Category("Appearance")]
 | 
						|
		public Font CaptionFont
 | 
						|
		{
 | 
						|
			get {return m_CaptionFont;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CaptionFont!=value)
 | 
						|
				{
 | 
						|
					m_CaptionFont=value;
 | 
						|
					this.RecalcLayout();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        private TextMarkup.BodyElement _CaptionTextMarkup = null;
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets text displayed in caption.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates text displayed in caption."),Category("Appearance"),DefaultValue(""), Localizable(true)]
 | 
						|
		public string CaptionText
 | 
						|
		{
 | 
						|
			get {return m_CaptionText;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CaptionText!=value)
 | 
						|
				{
 | 
						|
					m_CaptionText=value;
 | 
						|
 | 
						|
                    if (_CaptionTextMarkup != null)
 | 
						|
                    {
 | 
						|
                        _CaptionTextMarkup.MouseLeave(this);
 | 
						|
                        _CaptionTextMarkup.HyperLinkClick -= TextMarkupLinkClicked;
 | 
						|
                        _CaptionTextMarkup = null;
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (TextMarkup.MarkupParser.IsMarkup(ref m_CaptionText))
 | 
						|
                        _CaptionTextMarkup = TextMarkup.MarkupParser.Parse(m_CaptionText);
 | 
						|
 | 
						|
                    if (_CaptionTextMarkup != null)
 | 
						|
                    {
 | 
						|
                        _CaptionTextMarkup.HyperLinkClick += TextMarkupLinkClicked;
 | 
						|
                    }
 | 
						|
 | 
						|
					this.RecalcLayout();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets color of caption text.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates color of caption text"),Category("Appearance")]
 | 
						|
		public Color CaptionColor
 | 
						|
		{
 | 
						|
			get {return m_CaptionColor;}
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if(m_CaptionColor!=value)
 | 
						|
				{
 | 
						|
					m_CaptionColor=value;
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or set position of the balloon tip.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates position of the balloon tip."),Category("Appearance"),DefaultValue(eTipPosition.Top)]
 | 
						|
		public eTipPosition TipPosition
 | 
						|
		{
 | 
						|
			get {return m_TipPosition;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(m_TipPosition!=value)
 | 
						|
				{
 | 
						|
					m_TipPosition=value;
 | 
						|
					this.RecalcLayout();
 | 
						|
					if(TipPositionChanged!=null)
 | 
						|
						TipPositionChanged(this,new EventArgs());
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void InternalTipPositionChanged(eTipPosition newValue)
 | 
						|
		{
 | 
						|
			if(this.Controls.Count==0 || this.Style!=eBallonStyle.Balloon)
 | 
						|
				return;
 | 
						|
			if(newValue==eTipPosition.Top && m_TipPosition==eTipPosition.Bottom)
 | 
						|
			{
 | 
						|
				foreach(Control control in this.Controls)
 | 
						|
				{
 | 
						|
					control.Top+=m_TipLength;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else if(newValue==eTipPosition.Bottom && m_TipPosition==eTipPosition.Top)
 | 
						|
			{
 | 
						|
				foreach(Control control in this.Controls)
 | 
						|
				{
 | 
						|
					control.Top-=m_TipLength;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets tip distance from the edge of the balloon.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),Description("Indicates tip distance from the edge of the balloon."),Category("Appearance"),DefaultValue(32)]
 | 
						|
		public int TipOffset
 | 
						|
		{
 | 
						|
			get {return m_TipOffset;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(m_TipOffset!=value)
 | 
						|
				{
 | 
						|
					if(value<m_CornerSize)
 | 
						|
						value=m_CornerSize+1;
 | 
						|
					else if((m_TipPosition==eTipPosition.Top || m_TipPosition==eTipPosition.Bottom) && value>this.Width-m_CornerSize-m_TipLength)
 | 
						|
						value=this.Width-m_CornerSize-m_TipLength;
 | 
						|
					else if((m_TipPosition==eTipPosition.Left || m_TipPosition==eTipPosition.Right) && value>this.Height-m_CornerSize-m_TipLength)
 | 
						|
						value=this.Height-m_CornerSize-m_TipLength;
 | 
						|
 | 
						|
					m_TipOffset=value;
 | 
						|
					this.RecalcLayout();
 | 
						|
					if(this.DesignMode)
 | 
						|
						this.Refresh();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Returns length of the tip.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(false),Description("Returns tip length"),Category("Appearance")]
 | 
						|
		public int TipLength
 | 
						|
		{
 | 
						|
			get {return m_TipLength;}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Displays balloon using control to automatically calculate balloon location. Method is usually used display balloon that is showing information for the certain control.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="referenceControl">Control used for balloon positioning.</param>
 | 
						|
		public void Show(Control referenceControl)
 | 
						|
		{
 | 
						|
			this.Show(referenceControl,true);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Displays balloon using control to automatically calculate balloon location. Method is usually used display balloon that is showing information for the certain control.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="referenceControl">Control used for balloon positioning.</param>
 | 
						|
		/// <param name="balloonFocus">Indicates whether balloon receives input focus.</param>
 | 
						|
		public void Show(Control referenceControl, bool balloonFocus)
 | 
						|
		{
 | 
						|
			if(referenceControl==null)
 | 
						|
			{
 | 
						|
				this.Show();
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			Point scrLocCtrl=Point.Empty;
 | 
						|
			
 | 
						|
			if(referenceControl.Parent!=null)
 | 
						|
				scrLocCtrl=referenceControl.Parent.PointToScreen(referenceControl.Location);
 | 
						|
			else
 | 
						|
				scrLocCtrl=referenceControl.Location;
 | 
						|
			
 | 
						|
			this.Show(new Rectangle(scrLocCtrl,referenceControl.Size),balloonFocus);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Displays balloon using rectangle to automatically calculate balloon location. Method is usually used display balloon that is showing information for the certain screen region.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="referenceScreenRect">Rectangle in screen coordinates used for balloon positioning.</param>
 | 
						|
		/// <param name="balloonFocus">Indicates whether balloon receives input focus.</param>
 | 
						|
		public void Show(Rectangle referenceScreenRect, bool balloonFocus)
 | 
						|
		{
 | 
						|
			if(referenceScreenRect.IsEmpty)
 | 
						|
			{
 | 
						|
				this.Show();
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			int tipPositionOffset=m_TipLength+m_CornerSize*3;
 | 
						|
			int tipOffset=m_TipLength/2+m_CornerSize*3;
 | 
						|
			Point balloonLocation=Point.Empty;
 | 
						|
			ScreenInformation screen=BarFunctions.ScreenFromPoint(referenceScreenRect.Location);
 | 
						|
			
 | 
						|
			if(referenceScreenRect.X+referenceScreenRect.Width/2+this.Width>screen.WorkingArea.Right)
 | 
						|
			{
 | 
						|
				balloonLocation.X=referenceScreenRect.X+referenceScreenRect.Width/2-this.Width+tipPositionOffset;
 | 
						|
				tipOffset=this.Width-tipPositionOffset;
 | 
						|
			}
 | 
						|
			else
 | 
						|
				balloonLocation.X=referenceScreenRect.X+referenceScreenRect.Width/2-tipPositionOffset;
 | 
						|
			
 | 
						|
			if(referenceScreenRect.Y+referenceScreenRect.Height+this.Height>screen.WorkingArea.Bottom)
 | 
						|
			{
 | 
						|
				balloonLocation.Y=referenceScreenRect.Y-this.Height;
 | 
						|
				InternalTipPositionChanged(eTipPosition.Bottom);
 | 
						|
				this.TipPosition=eTipPosition.Bottom;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				balloonLocation.Y=referenceScreenRect.Y+referenceScreenRect.Height;
 | 
						|
				InternalTipPositionChanged(eTipPosition.Top);
 | 
						|
				this.TipPosition=eTipPosition.Top;
 | 
						|
			}
 | 
						|
 | 
						|
			this.TipOffset=tipOffset;
 | 
						|
			this.Location=balloonLocation;
 | 
						|
			this.Show(balloonFocus);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Displays balloon using item to automatically calculate balloon location. Method is usually used display balloon that is showing information for the certain item.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="item">Item used for balloon positioning.</param>
 | 
						|
		/// <param name="balloonFocus">Indicates whether balloon receives input focus.</param>
 | 
						|
		public void Show(BaseItem item, bool balloonFocus)
 | 
						|
		{
 | 
						|
			if(item==null || item.ContainerControl==null)
 | 
						|
			{
 | 
						|
				this.Show();
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			Point loc=((Control)item.ContainerControl).PointToScreen(item.DisplayRectangle.Location);
 | 
						|
			this.Show(new Rectangle(loc,item.DisplayRectangle.Size),balloonFocus);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Display balloon.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="balloonFocus">Indicates whether balloon receives input focus.</param>
 | 
						|
		public void Show(bool balloonFocus)
 | 
						|
		{
 | 
						|
			Rectangle rEnd=new Rectangle(this.Location,this.Size);
 | 
						|
			Rectangle rStart=GetAnimationRectangle();
 | 
						|
 | 
						|
			if(!balloonFocus)
 | 
						|
			{
 | 
						|
				if(this.TopMost)
 | 
						|
				{
 | 
						|
					this.TopMost=false;
 | 
						|
					NativeFunctions.SetWindowPos(this.Handle,new IntPtr(NativeFunctions.HWND_TOP),0,0,0,0,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE | NativeFunctions.SWP_NOSIZE);
 | 
						|
					this.TopMost=true;
 | 
						|
				}
 | 
						|
				else
 | 
						|
					NativeFunctions.SetWindowPos(this.Handle,new IntPtr(NativeFunctions.HWND_TOP),0,0,0,0,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE | NativeFunctions.SWP_NOSIZE);
 | 
						|
			}
 | 
						|
 | 
						|
			if(ShouldAnimate())
 | 
						|
			{
 | 
						|
				try
 | 
						|
				{
 | 
						|
					m_AnimationInProgress=true;
 | 
						|
					BarFunctions.AnimateControl(this,true,m_AlertAnimationDuration,rStart,rEnd);
 | 
						|
				}
 | 
						|
				finally
 | 
						|
				{
 | 
						|
					m_AnimationInProgress=false;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else
 | 
						|
				base.Show();
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Displays balloon.
 | 
						|
		/// </summary>
 | 
						|
		public new void Show()
 | 
						|
		{
 | 
						|
			this.Show(true);
 | 
						|
		}
 | 
						|
        /// <summary>
 | 
						|
        /// Called when balloon is hidden.
 | 
						|
        /// </summary>
 | 
						|
        protected virtual void HideBalloon()
 | 
						|
        {
 | 
						|
            DestroyAutoCloseTimer();
 | 
						|
            if (ShouldAnimate())
 | 
						|
            {
 | 
						|
                Rectangle rStart = new Rectangle(this.Location, this.Size);
 | 
						|
                Rectangle rEnd = GetAnimationRectangle();
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    m_AnimationInProgress = true;
 | 
						|
                    BarFunctions.AnimateControl(this, false, m_AlertAnimationDuration, rStart, rEnd);
 | 
						|
                }
 | 
						|
                finally
 | 
						|
                {
 | 
						|
                    m_AnimationInProgress = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
                base.Hide();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
		/// Hides balloon.
 | 
						|
		/// </summary>
 | 
						|
		public new void Hide()
 | 
						|
		{
 | 
						|
            HideBalloon();
 | 
						|
		}
 | 
						|
 | 
						|
		private bool ShouldAnimate()
 | 
						|
		{
 | 
						|
            if (m_Style != eBallonStyle.Balloon && m_AlertAnimation != eAlertAnimation.None && !this.DesignMode)
 | 
						|
                return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		private Rectangle GetAnimationRectangle()
 | 
						|
		{
 | 
						|
			Rectangle r=new Rectangle(this.Location,this.Size);
 | 
						|
			if(m_AlertAnimation==eAlertAnimation.BottomToTop)// && bShowing || m_AlertAnimation==eAlertAnimation.TopToBottom && !bShowing)
 | 
						|
			{
 | 
						|
				r.Y=r.Bottom-1;
 | 
						|
				r.Height=1;
 | 
						|
			}
 | 
						|
			else if(m_AlertAnimation==eAlertAnimation.TopToBottom)
 | 
						|
			{
 | 
						|
				r.Height=1;
 | 
						|
			}
 | 
						|
			else if(m_AlertAnimation==eAlertAnimation.LeftToRight)
 | 
						|
			{
 | 
						|
				r.Width=2;
 | 
						|
			}
 | 
						|
			else if(m_AlertAnimation==eAlertAnimation.RightToLeft)
 | 
						|
			{
 | 
						|
				r.X=r.Right-1;
 | 
						|
				r.Width=1;
 | 
						|
			}
 | 
						|
			return r;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets/Sets whether Balloon is visible.
 | 
						|
		/// </summary>
 | 
						|
		[DevCoBrowsable(true)]
 | 
						|
		public new bool Visible
 | 
						|
		{
 | 
						|
			get { return base.Visible;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if(value)
 | 
						|
					this.Show();
 | 
						|
				else
 | 
						|
					this.Hide();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		const int WM_MOUSEACTIVATE = 0x21;
 | 
						|
		const int MA_NOACTIVATE = 3;
 | 
						|
		protected override void WndProc(ref Message m)
 | 
						|
		{
 | 
						|
			if(m.Msg==WM_MOUSEACTIVATE)
 | 
						|
			{
 | 
						|
				m.Result=new System.IntPtr(MA_NOACTIVATE);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			base.WndProc(ref m);
 | 
						|
		}
 | 
						|
 | 
						|
		private class ImageButton
 | 
						|
		{
 | 
						|
			private Rectangle m_Bounds=Rectangle.Empty;
 | 
						|
			private Control m_Parent=null;
 | 
						|
			private bool m_MouseOver=false;
 | 
						|
			private bool m_MouseDown=false;
 | 
						|
			public Image Normal=null;
 | 
						|
			public Image Hover=null;
 | 
						|
			public Image Pressed=null;
 | 
						|
 | 
						|
			public event EventHandler Click;
 | 
						|
 | 
						|
			public ImageButton(Control parent, Rectangle bounds)
 | 
						|
			{
 | 
						|
				m_Parent=parent;
 | 
						|
				m_Bounds=bounds;
 | 
						|
			}
 | 
						|
 | 
						|
			public virtual void Paint(Graphics g)
 | 
						|
			{
 | 
						|
			    Rectangle bounds = m_Bounds;
 | 
						|
			    if(m_MouseDown)
 | 
						|
				{
 | 
						|
					if(Pressed!=null)
 | 
						|
						g.DrawImage(Pressed,bounds);
 | 
						|
				}
 | 
						|
				else if(m_MouseOver)
 | 
						|
				{
 | 
						|
					if(Hover!=null)
 | 
						|
						g.DrawImage(Hover,bounds);
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					if(Normal!=null)
 | 
						|
						g.DrawImage(Normal,bounds);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
		    public virtual void OnMouseMove(MouseEventArgs e)
 | 
						|
			{
 | 
						|
				if(m_MouseDown)
 | 
						|
					return;
 | 
						|
 | 
						|
				if(m_Bounds.Contains(e.X,e.Y))
 | 
						|
				{
 | 
						|
					if(!m_MouseOver)
 | 
						|
					{
 | 
						|
						m_MouseOver=true;
 | 
						|
						if(m_Parent!=null)
 | 
						|
							m_Parent.Invalidate(m_Bounds);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else if(m_MouseOver)
 | 
						|
				{
 | 
						|
					m_MouseOver=false;
 | 
						|
					if(m_Parent!=null)
 | 
						|
						m_Parent.Invalidate(m_Bounds);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			public virtual void OnMouseDown(MouseEventArgs e)
 | 
						|
			{
 | 
						|
				if(m_Bounds.Contains(e.X,e.Y) && !m_MouseDown)
 | 
						|
				{
 | 
						|
					m_MouseDown=true;
 | 
						|
					if(m_Parent!=null)
 | 
						|
						m_Parent.Invalidate(m_Bounds);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			public virtual void OnMouseUp(MouseEventArgs e)
 | 
						|
			{
 | 
						|
				if(m_Bounds.Contains(e.X,e.Y) && m_MouseDown)
 | 
						|
				{
 | 
						|
					m_MouseDown=false;
 | 
						|
					if(m_Parent!=null)
 | 
						|
						m_Parent.Invalidate(m_Bounds);
 | 
						|
					if(Click!=null)
 | 
						|
						Click(this,new EventArgs());
 | 
						|
				}
 | 
						|
				else if(m_MouseOver || m_MouseDown)
 | 
						|
				{
 | 
						|
					m_MouseDown=false;
 | 
						|
					m_MouseOver=false;
 | 
						|
					if(m_Parent!=null)
 | 
						|
						m_Parent.Invalidate(m_Bounds);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			public virtual void OnMouseLeave(EventArgs e)
 | 
						|
			{
 | 
						|
				if(m_MouseOver && !m_MouseDown)
 | 
						|
				{
 | 
						|
					m_MouseOver=false;
 | 
						|
					if(m_Parent!=null)
 | 
						|
						m_Parent.Invalidate(m_Bounds);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			public bool MouseDown
 | 
						|
			{
 | 
						|
				get {return m_MouseDown;}
 | 
						|
			}
 | 
						|
 | 
						|
			public bool MouseOver
 | 
						|
			{
 | 
						|
				get {return m_MouseOver;}
 | 
						|
			}
 | 
						|
 | 
						|
			public Rectangle Bounds
 | 
						|
			{
 | 
						|
				get {return m_Bounds;}
 | 
						|
				set {m_Bounds=value;}
 | 
						|
			}
 | 
						|
 | 
						|
			public Point Location
 | 
						|
			{
 | 
						|
				get {return m_Bounds.Location;}
 | 
						|
				set {m_Bounds.Location=value;}
 | 
						|
			}
 | 
						|
 | 
						|
			public System.Drawing.Size Size
 | 
						|
			{
 | 
						|
				get {return m_Bounds.Size;}
 | 
						|
				set {m_Bounds.Size=value;}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public class CustomPaintEventArgs:EventArgs
 | 
						|
	{
 | 
						|
		private System.Drawing.Graphics m_Graphics=null;
 | 
						|
		private Rectangle m_PaintRectangle=Rectangle.Empty;
 | 
						|
		public CustomPaintEventArgs(Graphics g, Rectangle r)
 | 
						|
		{
 | 
						|
			m_Graphics=g;
 | 
						|
			m_PaintRectangle=r;
 | 
						|
		}
 | 
						|
 | 
						|
		public System.Drawing.Graphics Graphics
 | 
						|
		{
 | 
						|
			get {return m_Graphics;}
 | 
						|
		}
 | 
						|
 | 
						|
		public Rectangle PaintRectangle
 | 
						|
		{
 | 
						|
			get {return m_PaintRectangle;}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |