423 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			423 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    using System;
 | 
						|
	using System.Windows.Forms;
 | 
						|
	using System.Drawing;
 | 
						|
	using System.Drawing.Text;
 | 
						|
    using System.Drawing.Drawing2D;
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    ///    Summary description for Tooltip.
 | 
						|
    /// </summary>
 | 
						|
    [System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false)]
 | 
						|
    public class ToolTip : System.Windows.Forms.Control
 | 
						|
    {
 | 
						|
		const long WS_POPUP=0x80000000L;
 | 
						|
		const long WS_CLIPSIBLINGS=0x04000000L;
 | 
						|
		const long WS_CLIPCHILDREN=0x02000000L;
 | 
						|
		const long WS_EX_TOOLWINDOW=0x00000080L;
 | 
						|
		const long WS_EX_TOPMOST=0x00000008L;
 | 
						|
 | 
						|
		// When set to true tooltip will be shown Immediately without delay
 | 
						|
		//static bool bShowToolTip;
 | 
						|
		
 | 
						|
		private string m_ToolTip;
 | 
						|
        private TextMarkup.BodyElement m_TextMarkup = null;
 | 
						|
        private eDotNetBarStyle m_Style = eDotNetBarStyle.Office2003;
 | 
						|
		private PopupShadow m_DropShadow=null;
 | 
						|
        private bool m_AntiAlias = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the rectangle of the control or item tooltip is displayed for.
 | 
						|
        /// </summary>
 | 
						|
        public Rectangle ReferenceRectangle = Rectangle.Empty;
 | 
						|
 | 
						|
        public ToolTip()
 | 
						|
        {
 | 
						|
			m_ToolTip="";
 | 
						|
			this.SetStyle(ControlStyles.Selectable,false);
 | 
						|
			this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
 | 
						|
			this.SetStyle(ControlStyles.Opaque,true);
 | 
						|
			this.SetStyle(ControlStyles.ResizeRedraw,true);
 | 
						|
            this.Font = SystemFonts.DefaultFont; // System.Windows.Forms.SystemInformation.MenuFont.Clone() as Font;
 | 
						|
			this.BackColor=SystemColors.Control;
 | 
						|
			this.ForeColor=SystemColors.ControlText;
 | 
						|
        }
 | 
						|
 | 
						|
        
 | 
						|
        public new string Text
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				return m_ToolTip;
 | 
						|
			}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_ToolTip=value;
 | 
						|
                if (MarkupEnabled && TextMarkup.MarkupParser.IsMarkup(ref m_ToolTip))
 | 
						|
                    m_TextMarkup = TextMarkup.MarkupParser.Parse(m_ToolTip);
 | 
						|
                else
 | 
						|
                    m_TextMarkup = null;
 | 
						|
                if (m_TextMarkup != null)
 | 
						|
                    AntiAlias = true;
 | 
						|
 | 
						|
                if (_TooltipShown)
 | 
						|
                {
 | 
						|
                    UpdateSize();
 | 
						|
                }
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        private static bool _MarkupEnabled = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether text-markup is enabled for the tooltips.
 | 
						|
        /// </summary>
 | 
						|
        public static bool MarkupEnabled
 | 
						|
        {
 | 
						|
            get { return _MarkupEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _MarkupEnabled = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
 | 
						|
        public bool AntiAlias
 | 
						|
        {
 | 
						|
            get { return m_AntiAlias; }
 | 
						|
            set { m_AntiAlias = value; }
 | 
						|
        }
 | 
						|
        private int _ColorDepth = -1;
 | 
						|
		protected override void OnPaint(PaintEventArgs e)
 | 
						|
		{
 | 
						|
            // Get the Color of ToolTip text
 | 
						|
            Color textColor = SystemColors.InfoText;
 | 
						|
            Color backColor = SystemColors.Info;
 | 
						|
            Color backColor2=Color.Empty;
 | 
						|
            Color borderColor = ColorScheme.GetColor("767676");
 | 
						|
 | 
						|
            if (_ColorDepth == -1)
 | 
						|
            {
 | 
						|
                _ColorDepth = Screen.FromControl(this).BitsPerPixel;
 | 
						|
            }
 | 
						|
            if (_ColorDepth < 8)
 | 
						|
            {
 | 
						|
                backColor = Color.White;
 | 
						|
                textColor = Color.Black;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (StyleManager.IsMetro(m_Style))
 | 
						|
                {
 | 
						|
                    DevComponents.DotNetBar.Metro.ColorTables.MetroColorTable metroColors = DevComponents.DotNetBar.Metro.Rendering.MetroRender.GetColorTable();
 | 
						|
                    backColor = metroColors.CanvasColor;
 | 
						|
                    textColor = metroColors.ForeColor;
 | 
						|
                }
 | 
						|
                else if (BarFunctions.IsOffice2007Style(m_Style) && this.BackColor == SystemColors.Control)
 | 
						|
                {
 | 
						|
                    backColor = ColorScheme.GetColor("FFFFFF");
 | 
						|
                    backColor2 = ColorScheme.GetColor("E4E4F0");
 | 
						|
                    textColor = ColorScheme.GetColor("4C4C4C");
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    textColor = GetToolTipColor();
 | 
						|
                    if (this.BackColor != SystemColors.Control)
 | 
						|
                        backColor = this.BackColor;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
			Graphics g=e.Graphics;
 | 
						|
			Rectangle r=this.ClientRectangle;
 | 
						|
 | 
						|
            if (m_AntiAlias)
 | 
						|
            {
 | 
						|
                g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | 
						|
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 | 
						|
            }
 | 
						|
 | 
						|
            SmoothingMode sm = g.SmoothingMode;
 | 
						|
            g.SmoothingMode = SmoothingMode.None;
 | 
						|
            if (BarFunctions.IsOffice2007Style(m_Style))
 | 
						|
            {
 | 
						|
                DisplayHelp.DrawRectangle(g, borderColor, r);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                System.Windows.Forms.ControlPaint.DrawBorder3D(g, r, System.Windows.Forms.Border3DStyle.Raised, System.Windows.Forms.Border3DSide.All);
 | 
						|
            }
 | 
						|
			
 | 
						|
			r.Inflate(-1,-1);
 | 
						|
            if (backColor2.IsEmpty)
 | 
						|
                DisplayHelp.FillRectangle(g, r, backColor);
 | 
						|
            else
 | 
						|
                DisplayHelp.FillRectangle(g, r, backColor, backColor2);
 | 
						|
			
 | 
						|
			r.Offset(1,0);
 | 
						|
 | 
						|
            g.SmoothingMode = sm;
 | 
						|
 | 
						|
            if (m_TextMarkup == null)
 | 
						|
                TextDrawing.DrawString(g, GetDrawText(), this.Font, textColor, r, GetStringFormat());
 | 
						|
            else
 | 
						|
            {
 | 
						|
                TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, textColor, (this.RightToLeft == RightToLeft.Yes), e.ClipRectangle, true);
 | 
						|
                m_TextMarkup.Bounds = new Rectangle(r.Location, m_TextMarkup.Bounds.Size);
 | 
						|
                m_TextMarkup.Render(d);
 | 
						|
            }
 | 
						|
		}
 | 
						|
 | 
						|
        private void UpdateSize()
 | 
						|
        {
 | 
						|
            // Calculate Size of the window
 | 
						|
            using (Graphics g = this.CreateGraphics())
 | 
						|
            {
 | 
						|
                if (m_AntiAlias)
 | 
						|
                {
 | 
						|
                    g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | 
						|
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 | 
						|
                }
 | 
						|
                Size size = GetTooltipSize(g);
 | 
						|
                this.Size = size;
 | 
						|
                g.SmoothingMode = SmoothingMode.Default;
 | 
						|
                g.TextRenderingHint = TextRenderingHint.SystemDefault;
 | 
						|
            }
 | 
						|
 | 
						|
            if (!_FixedLocation.IsEmpty)
 | 
						|
                this.Location = _FixedLocation;
 | 
						|
 | 
						|
            this.Invalidate();
 | 
						|
 | 
						|
            Rectangle r = this.Bounds;
 | 
						|
            if (m_DropShadow != null)
 | 
						|
            {
 | 
						|
                NativeFunctions.SetWindowPos(m_DropShadow.Handle, this.Handle, r.Left + 5, r.Top + 5, r.Width - 2, r.Height - 2, NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
 | 
						|
                m_DropShadow.UpdateShadow();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _TooltipShown = false;
 | 
						|
        private Size GetTooltipSize(Graphics g)
 | 
						|
        {
 | 
						|
            Size sz = Size.Empty;
 | 
						|
            if (m_TextMarkup == null)
 | 
						|
                sz = TextDrawing.MeasureString(g, GetDrawText(), this.Font, Screen.PrimaryScreen.WorkingArea.Size, GetStringFormat());
 | 
						|
            else
 | 
						|
            {
 | 
						|
                TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
 | 
						|
                m_TextMarkup.Measure(Screen.PrimaryScreen.WorkingArea.Size, d);
 | 
						|
                sz = m_TextMarkup.Bounds.Size;
 | 
						|
                m_TextMarkup.Arrange(new Rectangle(Point.Empty, sz), d);
 | 
						|
            }
 | 
						|
            sz.Width += Dpi.Width4;
 | 
						|
            sz.Height += Dpi.Height4;
 | 
						|
            return sz;
 | 
						|
        }
 | 
						|
		public void ShowToolTip()
 | 
						|
		{
 | 
						|
			if (!this.IsHandleCreated)
 | 
						|
				this.CreateControl();
 | 
						|
 | 
						|
            
 | 
						|
			// Calculate Size of the window
 | 
						|
			Graphics g=this.CreateGraphics();
 | 
						|
 | 
						|
            if (m_AntiAlias)
 | 
						|
            {
 | 
						|
                g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | 
						|
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 | 
						|
            }
 | 
						|
            Size sz = Size.Empty;
 | 
						|
            try
 | 
						|
            {
 | 
						|
                g.PageUnit = GraphicsUnit.Pixel;
 | 
						|
                sz = GetTooltipSize(g);
 | 
						|
                //if (m_TextMarkup == null)
 | 
						|
                //    sz = TextDrawing.MeasureString(g, GetDrawText(), this.Font, Screen.PrimaryScreen.WorkingArea.Size, GetStringFormat());
 | 
						|
                //else
 | 
						|
                //{
 | 
						|
                //    TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
 | 
						|
                //    m_TextMarkup.Measure(Screen.PrimaryScreen.WorkingArea.Size, d);
 | 
						|
                //    sz = m_TextMarkup.Bounds.Size;
 | 
						|
                //    m_TextMarkup.Arrange(new Rectangle(Point.Empty, sz), d);
 | 
						|
                //}
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                g.SmoothingMode = SmoothingMode.Default;
 | 
						|
                g.TextRenderingHint = TextRenderingHint.SystemDefault;
 | 
						|
                g.Dispose();
 | 
						|
            }
 | 
						|
			g=null;
 | 
						|
 | 
						|
			Point mousePosition=System.Windows.Forms.Control.MousePosition;
 | 
						|
			Rectangle r=new Rectangle(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y,(int)sz.Width,(int)sz.Height);
 | 
						|
			//r.Inflate(2,2);
 | 
						|
			r.Offset(12,24);
 | 
						|
 | 
						|
			ScreenInformation screen=BarFunctions.ScreenFromPoint(mousePosition);
 | 
						|
			if(screen!=null)
 | 
						|
			{
 | 
						|
				System.Drawing.Size layoutArea=screen.WorkingArea.Size;
 | 
						|
				layoutArea.Width-=(int)(layoutArea.Width*.2f);
 | 
						|
 | 
						|
                if (r.Right > screen.WorkingArea.Right)
 | 
						|
                {
 | 
						|
                    r.X = r.Left - (r.Right - screen.WorkingArea.Right);
 | 
						|
                }
 | 
						|
 | 
						|
                if (r.Bottom > screen.Bounds.Bottom)
 | 
						|
                {
 | 
						|
                    if (ReferenceRectangle.IsEmpty)
 | 
						|
                        r.Y = mousePosition.Y - r.Height;
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        r.Y = ReferenceRectangle.Y - r.Height - 1;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
				
 | 
						|
				if(r.Contains(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y))
 | 
						|
				{
 | 
						|
					// We have to move it out of mouse position
 | 
						|
                    if (r.Height + System.Windows.Forms.Control.MousePosition.Y + 1 <= screen.WorkingArea.Height && (ReferenceRectangle.IsEmpty || !ReferenceRectangle.IntersectsWith(new Rectangle(r.X, System.Windows.Forms.Control.MousePosition.Y + 1, r.Width, r.Height))))
 | 
						|
						r.Y=System.Windows.Forms.Control.MousePosition.Y+1;
 | 
						|
					else
 | 
						|
						r.Y=System.Windows.Forms.Control.MousePosition.Y-r.Height-1;
 | 
						|
				}
 | 
						|
			}
 | 
						|
            
 | 
						|
            if (!_FixedLocation.IsEmpty)
 | 
						|
                r.Location = _FixedLocation;
 | 
						|
 | 
						|
			this.Location=r.Location;
 | 
						|
			this.ClientSize=r.Size;
 | 
						|
 | 
						|
			if(NativeFunctions.ShowDropShadow && this.ShowDropShadow)
 | 
						|
			{
 | 
						|
				if(m_DropShadow==null)
 | 
						|
				{
 | 
						|
					m_DropShadow=new PopupShadow(NativeFunctions.AlphaBlendingSupported);
 | 
						|
					m_DropShadow.CreateControl();
 | 
						|
				}
 | 
						|
				//m_DropShadow.Location=new Point(r.Left+4,r.Top+4);
 | 
						|
				//m_DropShadow.Size=r.Size;
 | 
						|
				// TODO: Bug Cannot set size and location correctly using the Size and Location because Form caption is hidden
 | 
						|
				m_DropShadow.Hide();
 | 
						|
			}
 | 
						|
			NativeFunctions.SetWindowPos(this.Handle,new IntPtr(NativeFunctions.HWND_TOP),0,0,0,0,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOSIZE | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE);
 | 
						|
			if(m_DropShadow!=null)
 | 
						|
			{
 | 
						|
				NativeFunctions.SetWindowPos(m_DropShadow.Handle,this.Handle,r.Left+5,r.Top+5,r.Width-2,r.Height-2,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
 | 
						|
				m_DropShadow.UpdateShadow();
 | 
						|
			}
 | 
						|
            _TooltipShown = true;
 | 
						|
		}
 | 
						|
 | 
						|
        private string GetDrawText()
 | 
						|
        {
 | 
						|
            string s = m_ToolTip.Replace(@"\\n", "{spec_nl}");
 | 
						|
            s = s.Replace(@"\n", Environment.NewLine);
 | 
						|
            return s.Replace("{spec_nl}",@"\n");
 | 
						|
        }
 | 
						|
 | 
						|
		private eTextFormat GetStringFormat()
 | 
						|
		{
 | 
						|
            eTextFormat format = eTextFormat.Default | eTextFormat.WordBreak | eTextFormat.VerticalCenter;
 | 
						|
            return format;
 | 
						|
		}
 | 
						|
 | 
						|
		private Color GetToolTipColor()
 | 
						|
		{
 | 
						|
			if(this.ForeColor!=SystemColors.ControlText)
 | 
						|
				return this.ForeColor;
 | 
						|
 | 
						|
			Color clrRet=SystemColors.WindowText;
 | 
						|
 | 
						|
			try
 | 
						|
			{
 | 
						|
				Microsoft.Win32.RegistryKey objReg=Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Control Panel\\Colors\\",false);
 | 
						|
				string sColor=objReg.GetValue("InfoText").ToString();
 | 
						|
				objReg.Close();
 | 
						|
				objReg=null;
 | 
						|
				
 | 
						|
				if(sColor==null || sColor=="")
 | 
						|
					return clrRet;
 | 
						|
 | 
						|
				Char [] separator = {' '};
 | 
						|
				string[] sArr=sColor.Split(separator,3);
 | 
						|
				if(sArr.GetUpperBound(0)==2)
 | 
						|
					clrRet=Color.FromArgb(System.Convert.ToInt16(sArr[0]),System.Convert.ToInt16(sArr[1]),System.Convert.ToInt16(sArr[2]));
 | 
						|
			}
 | 
						|
			catch(Exception)
 | 
						|
			{
 | 
						|
			}
 | 
						|
 | 
						|
			return clrRet;
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnLocationChanged(EventArgs e)
 | 
						|
		{
 | 
						|
			base.OnLocationChanged(e);
 | 
						|
			if(m_DropShadow!=null)
 | 
						|
			{
 | 
						|
				NativeFunctions.SetWindowPos(m_DropShadow.Handle,new IntPtr(NativeFunctions.HWND_TOP),this.Left+5,this.Top+5,0,0,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOSIZE);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        private Point _FixedLocation = Point.Empty;
 | 
						|
        /// <summary>
 | 
						|
        /// Specifies fixed location for tooltip window.
 | 
						|
        /// </summary>
 | 
						|
        public Point FixedLocation
 | 
						|
        {
 | 
						|
            get { return _FixedLocation; }
 | 
						|
            set { _FixedLocation = value; }
 | 
						|
        }
 | 
						|
 | 
						|
		protected override CreateParams CreateParams
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				CreateParams p=base.CreateParams;
 | 
						|
				p.Style=unchecked((int)(WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
 | 
						|
				p.ExStyle=(int)(WS_EX_TOOLWINDOW | WS_EX_TOPMOST);
 | 
						|
				p.Caption="";
 | 
						|
				return p;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void OnVisibleChanged(EventArgs e)
 | 
						|
		{
 | 
						|
			if(!this.Visible && m_DropShadow!=null)
 | 
						|
			{
 | 
						|
				m_DropShadow.Hide();
 | 
						|
				m_DropShadow.Dispose();
 | 
						|
				m_DropShadow=null;
 | 
						|
			}
 | 
						|
			base.OnVisibleChanged(e);
 | 
						|
		}
 | 
						|
 | 
						|
        public eDotNetBarStyle Style
 | 
						|
        {
 | 
						|
            get { return m_Style; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                m_Style = value;
 | 
						|
                if (BarFunctions.IsOffice2007Style(m_Style))
 | 
						|
                    this.AntiAlias = true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _ShowDropShadow = true;
 | 
						|
        public bool ShowDropShadow
 | 
						|
        {
 | 
						|
            get { return _ShowDropShadow; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _ShowDropShadow = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
 | 
						|
    }
 | 
						|
}
 |