838 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			838 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using System.Drawing;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Drawing.Text;
 | |
| using System.ComponentModel.Design;
 | |
| using System.Reflection;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Controls
 | |
| {
 | |
|     [ToolboxBitmap(typeof(GroupPanel), "Controls.GroupPanel.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.GroupPanelDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
 | |
|     public class GroupPanel : PanelControl, INonClientControl
 | |
|     {
 | |
|         #region Private Variables
 | |
|         private NonClientPaintHandler m_NCPainter = null;
 | |
|         private Image m_TitleImage = null;
 | |
|         private eTitleImagePosition m_TitleImagePosition = eTitleImagePosition.Left;
 | |
|         private bool m_DrawTitleBox = true;
 | |
|         private bool m_IsShadowEnabled = false;
 | |
|         #endregion
 | |
| 
 | |
|         #region Constructor
 | |
|         public GroupPanel()
 | |
|         {
 | |
|             m_NCPainter = new NonClientPaintHandler(this, eScrollBarSkin.Optimized);
 | |
|             m_NCPainter.BeforeBorderPaint += new CustomNCPaintEventHandler(NCBeforeBorderPaint);
 | |
|             m_NCPainter.AfterBorderPaint += new CustomNCPaintEventHandler(NCAfterBorderPaint);
 | |
|             
 | |
|             this.SetStyle(ControlStyles.StandardDoubleClick, true);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
|         private ePanelColorTable _ColorTable = ePanelColorTable.Default;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the panel color scheme.
 | |
|         /// </summary>
 | |
|         [DefaultValue(ePanelColorTable.Default), Category("Appearance"), Description("Indicates panel color scheme.")]
 | |
|         public ePanelColorTable ColorTable
 | |
|         {
 | |
|             get { return _ColorTable; }
 | |
|             set 
 | |
|             {
 | |
|                 _ColorTable = value;
 | |
|                 SetColorTable(value);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void OnResize(EventArgs e)
 | |
|         {
 | |
|             InvalidateNonClient();
 | |
|             base.OnResize(e);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Gets or sets the image that appears in title with text.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DefaultValue(null), Category("Visual"), Description("Indicates image that appears in title with text.")]
 | |
|         public Image TitleImage
 | |
|         {
 | |
|             get { return m_TitleImage; }
 | |
|             set
 | |
|             {
 | |
|                 m_TitleImage = value;
 | |
|                 RefreshTextClientRectangle();
 | |
|                 this.Invalidate();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the position of the title image. Default value is left.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DefaultValue(eTitleImagePosition.Left), Category("Visual"), Description("Indicates position of the title image.")]
 | |
|         public eTitleImagePosition TitleImagePosition
 | |
|         {
 | |
|             get { return m_TitleImagePosition; }
 | |
|             set
 | |
|             {
 | |
|                 m_TitleImagePosition = value;
 | |
|                 RefreshTextClientRectangle();
 | |
|                 this.Invalidate();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         [Browsable(true), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
 | |
|         public override Color BackColor
 | |
|         {
 | |
|             get { return base.BackColor; }
 | |
|             set { base.BackColor = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the scrollbar skining type when control is using Office 2007 style.
 | |
|         /// </summary>
 | |
|         [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | |
|         public eScrollBarSkin ScrollbarSkin
 | |
|         {
 | |
|             get { return m_NCPainter.SkinScrollbars; }
 | |
|             set { m_NCPainter.SkinScrollbars = value; }
 | |
|         }
 | |
| 
 | |
|         protected override void Dispose(bool disposing)
 | |
|         {
 | |
|             if (m_NCPainter != null)
 | |
|             {
 | |
|                 m_NCPainter.Dispose();
 | |
|                 //m_NCPainter = null;
 | |
|             }
 | |
|             if (BarUtilities.DisposeItemImages && !this.DesignMode)
 | |
|             {
 | |
|                 BarUtilities.DisposeImage(ref m_TitleImage);
 | |
|             }
 | |
|             base.Dispose(disposing);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Specifies whether item is drawn using Themes when running on OS that supports themes like Windows XP.
 | |
|         /// </summary>
 | |
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DefaultValue(false), Category("Appearance"), Description("Specifies whether item is drawn using Themes when running on OS that supports themes like Windows XP.")]
 | |
|         public override bool ThemeAware
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return base.ThemeAware;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 base.ThemeAware = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether box around the title of the group is drawn. Default value is true.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DefaultValue(true), Category("Appearance"), Description("")]
 | |
|         public bool DrawTitleBox
 | |
|         {
 | |
|             get { return m_DrawTitleBox; }
 | |
|             set
 | |
|             {
 | |
|                 if (m_DrawTitleBox != value)
 | |
|                 {
 | |
|                     m_DrawTitleBox = value;
 | |
|                     this.InvalidateNonClient();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Invalidates non-client area of the control.
 | |
|         /// </summary>
 | |
|         public void InvalidateNonClient()
 | |
|         {
 | |
|             if (!BarFunctions.IsHandleValid(this)) return;
 | |
|             const int RDW_INVALIDATE = 0x0001;
 | |
|             const int RDW_FRAME = 0x0400;
 | |
|             NativeFunctions.RECT r = new NativeFunctions.RECT(0, 0, this.Width, this.Height);
 | |
|             NativeFunctions.RedrawWindow(this.Handle, ref r, IntPtr.Zero, RDW_INVALIDATE | RDW_FRAME);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Paints insides of the control.
 | |
|         /// </summary>
 | |
|         /// <param name="e">Paint event arguments.</param>
 | |
|         protected override void PaintInnerContent(PaintEventArgs e, ElementStyle style, bool paintText)
 | |
|         {
 | |
|             Graphics g = e.Graphics;
 | |
|             if (this.TextMarkupElement == null)
 | |
|                 RefreshTextClientRectangle();
 | |
|             Rectangle r = this.DisplayRectangle;
 | |
| #if FRAMEWORK20
 | |
|             r.X -= this.Padding.Left;
 | |
|             r.Y -= this.Padding.Top;
 | |
|             r.Width += this.Padding.Horizontal;
 | |
|             r.Height += this.Padding.Vertical;
 | |
| #else
 | |
|             r.X -= this.DockPadding.Left;
 | |
|             r.Y -= this.DockPadding.Top;
 | |
|             r.Width += this.DockPadding.Left + this.DockPadding.Right;
 | |
|             r.Height += this.DockPadding.Top + this.DockPadding.Bottom;
 | |
| #endif
 | |
|             r.Inflate(2, 2);
 | |
|             ElementStyleDisplayInfo info = new ElementStyleDisplayInfo(style, g, r);
 | |
|             info.RightToLeft = (this.RightToLeft == RightToLeft.Yes);
 | |
|             ElementStyleDisplay.PaintBackground(info, false);
 | |
|             if (style.BackgroundImage != null) ElementStyleDisplay.PaintBackgroundImage(info);
 | |
|             if (!m_IsShadowEnabled) return;
 | |
|             ShadowPaintInfo pi = new ShadowPaintInfo();
 | |
|             pi.Graphics = g;
 | |
|             pi.Size = 6;
 | |
|             foreach (Control c in this.Controls)
 | |
|             {
 | |
|                 if (!c.Visible || c.BackColor == Color.Transparent && !(c is GroupPanel)) continue;
 | |
|                 if (c is GroupPanel)
 | |
|                 {
 | |
|                     GroupPanel p = c as GroupPanel;
 | |
|                     pi.Rectangle = new Rectangle(c.Bounds.X, c.Bounds.Y + p.GetInternalClientRectangle().Y / 2, c.Bounds.Width, c.Bounds.Height - p.GetInternalClientRectangle().Y / 2);
 | |
|                 }
 | |
|                 else
 | |
|                     pi.Rectangle = c.Bounds;
 | |
|                 ShadowPainter.Paint2(pi);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void NCAfterBorderPaint(object sender, CustomNCPaintEventArgs e)
 | |
|         {
 | |
|             Graphics g = e.Graphics;
 | |
| 
 | |
|             TextRenderingHint th = g.TextRenderingHint;
 | |
|             SmoothingMode sm = g.SmoothingMode;
 | |
|             if (this.AntiAlias)
 | |
|             {
 | |
|                 g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | |
|                 g.SmoothingMode = SmoothingMode.AntiAlias;
 | |
|             }
 | |
|             g.ResetClip();
 | |
|             ElementStyle style = this.Style;
 | |
| 
 | |
|             if (!this.Enabled)
 | |
|             {
 | |
|                 style = style.Copy();
 | |
|                 style.TextColor = GetColorScheme().ItemDisabledText;
 | |
|             }
 | |
| 
 | |
|             if (m_DrawTitleBox && !m_TitleArea.IsEmpty)
 | |
|             {
 | |
|                 DisplayHelp.FillRoundedRectangle(g, m_TitleArea, 2, style.BackColor, style.BackColor2, -90);
 | |
|                 DisplayHelp.DrawRoundedRectangle(g, this.Style.BorderColor, m_TitleArea, 2);
 | |
|             }
 | |
| 
 | |
|             Rectangle rText = new Rectangle(m_NCPainter.ClientRectangle.X + 4, 1, this.ClientRectangle.Width - 8, m_NCPainter.ClientRectangle.Y - 1);
 | |
|             if (m_TitleImage != null)
 | |
|             {
 | |
|                 Size textSize = GetAutoSize(rText.Width);
 | |
|                 if (m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.No || m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.Yes)
 | |
|                 {
 | |
|                     g.DrawImage(m_TitleImage, rText.X - 1, rText.Y, m_TitleImage.Width, m_TitleImage.Height);
 | |
|                     rText.X += m_TitleImage.Width;
 | |
|                     rText.Width -= m_TitleImage.Width;
 | |
|                 }
 | |
|                 else if (m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.No || m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.Yes)
 | |
|                 {
 | |
|                     g.DrawImage(m_TitleImage, rText.Right - m_TitleImage.Width, rText.Y, m_TitleImage.Width, m_TitleImage.Height);
 | |
|                     rText.Width -= m_TitleImage.Width;
 | |
|                 }
 | |
|                 else if (m_TitleImagePosition == eTitleImagePosition.Center)
 | |
|                 {
 | |
|                     g.DrawImage(m_TitleImage, rText.X + (rText.Width - m_TitleImage.Width) / 2, rText.Y, m_TitleImage.Width, m_TitleImage.Height);
 | |
|                 }
 | |
|                 rText.Y = rText.Bottom - textSize.Height - 2;
 | |
|             }
 | |
| 
 | |
|             // Paint text
 | |
|             if (this.TextMarkupElement == null)
 | |
|             {
 | |
|                 ElementStyleDisplayInfo info = new ElementStyleDisplayInfo(style, g, rText);
 | |
|                 info.RightToLeft = (this.RightToLeft == RightToLeft.Yes);
 | |
|                 ElementStyleDisplay.PaintText(info, this.Text, this.Font);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 TextRenderingHint tr = g.TextRenderingHint;
 | |
|                 if (this.AntiAlias)
 | |
|                     g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | |
|                 TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, style.TextColor, (this.RightToLeft == RightToLeft.Yes), Rectangle.Empty, true);
 | |
|                 Rectangle r = this.TextMarkupElement.Bounds;
 | |
|                 if (style.TextAlignment == eStyleTextAlignment.Center)
 | |
|                     this.TextMarkupElement.Bounds = new Rectangle(this.TextMarkupElement.Bounds.X + (rText.Width - this.TextMarkupElement.Bounds.Width) / 2, this.TextMarkupElement.Bounds.Y,
 | |
|                         this.TextMarkupElement.Bounds.Width, this.TextMarkupElement.Bounds.Height);
 | |
|                 else if(style.TextAlignment == eStyleTextAlignment.Far && this.RightToLeft == RightToLeft.No || this.RightToLeft == RightToLeft.Yes && style.TextAlignment== eStyleTextAlignment.Near)
 | |
|                     this.TextMarkupElement.Bounds = new Rectangle(rText.Right - this.TextMarkupElement.Bounds.Width, this.TextMarkupElement.Bounds.Y,
 | |
|                         this.TextMarkupElement.Bounds.Width, this.TextMarkupElement.Bounds.Height);
 | |
|                 this.TextMarkupElement.Render(d);
 | |
|                 g.TextRenderingHint = tr;
 | |
|                 this.TextMarkupElement.Bounds = r;
 | |
|             }
 | |
| 
 | |
|             g.TextRenderingHint = th;
 | |
|             g.SmoothingMode = sm;
 | |
|         }
 | |
|         private Rectangle m_TitleArea = Rectangle.Empty;
 | |
|         private void NCBeforeBorderPaint(object sender, CustomNCPaintEventArgs e)
 | |
|         {
 | |
|             m_TitleArea = Rectangle.Empty;
 | |
|             // Exclude text area from border rendering
 | |
|             if (this.Text != null && this.Text.Length > 0)
 | |
|             {
 | |
|                 Size s = GetAutoSize(this.ClientRectangle.Width - 8);
 | |
|                 Rectangle r = new Rectangle(m_NCPainter.ClientRectangle.X  + 3, 0, s.Width, m_NCPainter.ClientRectangle.Y);
 | |
|                 Size availSize = new Size(m_NCPainter.ClientRectangle.Width - 8, m_NCPainter.ClientRectangle.Y);
 | |
|                 
 | |
|                     if (m_TitleImage != null && (m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.Yes ||
 | |
|                             m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.No))
 | |
|                     {
 | |
|                         //r.X -= m_TitleImage.Width;
 | |
|                         availSize.Width -= m_TitleImage.Width;
 | |
|                     }
 | |
|                     else if (m_TitleImage != null && (m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.Yes ||
 | |
|                             m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.No))
 | |
|                     {
 | |
|                         r.X += m_TitleImage.Width;
 | |
|                         availSize.Width -= m_TitleImage.Width;
 | |
|                     }
 | |
|                 //if (this.TextMarkupElement == null)
 | |
|                 {
 | |
|                     if (this.Style.TextAlignment == eStyleTextAlignment.Center)
 | |
|                     {
 | |
|                         //r.X = m_NCPainter.ClientRectangle.X;
 | |
|                         r.X += (availSize.Width - r.Width) / 2;
 | |
|                     }
 | |
|                     else if (this.Style.TextAlignment == eStyleTextAlignment.Far || this.RightToLeft == RightToLeft.Yes && this.Style.TextAlignment == eStyleTextAlignment.Near)
 | |
|                     {
 | |
|                         r.X = r.X + (availSize.Width - r.Width);
 | |
|                     }
 | |
|                 }
 | |
|                 
 | |
|                 if (!r.IsEmpty)
 | |
|                 {
 | |
|                     r.Inflate(3, 0);
 | |
|                     r.Width += 3;
 | |
|                 }
 | |
| 
 | |
|                 e.Graphics.SetClip(r, System.Drawing.Drawing2D.CombineMode.Exclude);
 | |
|                 m_TitleArea = r;
 | |
|             }
 | |
| 
 | |
|             if (m_TitleImage != null)
 | |
|             {
 | |
|                 Rectangle r = new Rectangle(m_NCPainter.ClientRectangle.X + 3, 0, m_TitleImage.Width, m_TitleImage.Height);
 | |
|                 if (m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.Yes ||
 | |
|                     m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.No)
 | |
|                 {
 | |
|                     r.X = m_NCPainter.ClientRectangle.Right - r.Width - 4;
 | |
|                 }
 | |
|                 else if (m_TitleImagePosition == eTitleImagePosition.Center)
 | |
|                 {
 | |
|                     r.X = m_NCPainter.ClientRectangle.X;
 | |
|                     r.X += (m_NCPainter.ClientRectangle.Width - r.Width) / 2;
 | |
|                 }
 | |
| 
 | |
|                 e.Graphics.SetClip(r, System.Drawing.Drawing2D.CombineMode.Exclude);
 | |
|                 if (m_TitleArea.IsEmpty)
 | |
|                     m_TitleArea = r;
 | |
|                 else
 | |
|                     m_TitleArea = Rectangle.Union(r, m_TitleArea);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns the size of the panel calculated based on the text assigned.
 | |
|         /// </summary>
 | |
|         /// <returns>Calculated size of the panel or Size.Empty if panel size cannot be calculated.</returns>
 | |
|         private Size GetAutoSize(int preferedWidth)
 | |
|         {
 | |
|             Size size = Size.Empty;
 | |
|             if (!this.IsHandleCreated) return size;
 | |
|             
 | |
|             if (TextMarkupElement != null)
 | |
|             {
 | |
|                 if (preferedWidth == 0)
 | |
|                 {
 | |
|                     size = TextMarkupElement.Bounds.Size;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     size = GetMarkupSize(preferedWidth);
 | |
|                 }
 | |
|                 size.Width += 4;
 | |
|                 //size.Height += 1;
 | |
|             }
 | |
|             else if (this.Text.Length > 0)
 | |
|             {
 | |
|                 Font font = this.Font;
 | |
|                 if (this.Style.Font != null) font = this.Style.Font;
 | |
|                 eTextFormat tf = eTextFormat.Default | eTextFormat.SingleLine | eTextFormat.NoPrefix;
 | |
|                 using (Graphics g = BarFunctions.CreateGraphics(this))
 | |
|                 {
 | |
|                     if (preferedWidth <= 0)
 | |
|                         size = TextDrawing.MeasureString(g, this.Text, font, 0, tf);
 | |
|                     else
 | |
|                         size = TextDrawing.MeasureString(g, this.Text, font, preferedWidth, tf);
 | |
|                 }
 | |
|                 size.Width += 2;
 | |
|                 size.Height += 2;
 | |
|             }
 | |
| 
 | |
|             if (size.IsEmpty) return size;
 | |
| 
 | |
|             size.Width += this.Style.MarginLeft + this.Style.MarginRight;
 | |
|             size.Height += this.Style.MarginTop + this.Style.MarginBottom;
 | |
| 
 | |
|             return size;
 | |
|         }
 | |
| 
 | |
|         private Size GetMarkupSize(int proposedWidth)
 | |
|         {
 | |
|             Size size = Size.Empty;
 | |
|             if (TextMarkupElement != null)
 | |
|             {
 | |
|                 Rectangle r = new Rectangle(0, 0, proposedWidth, 500);
 | |
|                 r.Inflate(-2, -2);
 | |
|                 Graphics g = this.CreateGraphics();
 | |
|                 TextMarkup.BodyElement markup = TextMarkup.MarkupParser.Parse(this.Text);
 | |
|                 try
 | |
|                 {
 | |
|                     if (AntiAlias)
 | |
|                     {
 | |
|                         g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 | |
|                         g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | |
|                     }
 | |
|                     TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
 | |
|                     markup.Measure(r.Size, d);
 | |
|                     size = markup.Bounds.Size;
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     g.Dispose();
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return size;
 | |
|         }
 | |
| 
 | |
|         protected override void RefreshTextClientRectangle()
 | |
|         {
 | |
|             if (m_NCPainter != null)
 | |
|             {
 | |
|                 Rectangle r = new Rectangle(m_NCPainter.ClientRectangle.X, 0, m_NCPainter.ClientRectangle.Width, this.Height / 2);
 | |
|                 r.Inflate(-2, 0);
 | |
|                 if (m_TitleImage != null)
 | |
|                 {
 | |
|                     if (m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.No ||
 | |
|                         m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.Yes)
 | |
|                     {
 | |
|                         r.X += m_TitleImage.Width;
 | |
|                         r.Width -= m_TitleImage.Width;
 | |
|                     }
 | |
|                     else if (m_TitleImagePosition == eTitleImagePosition.Left && this.RightToLeft == RightToLeft.Yes ||
 | |
|                         m_TitleImagePosition == eTitleImagePosition.Right && this.RightToLeft == RightToLeft.No)
 | |
|                     {
 | |
|                         r.Width -= m_TitleImage.Width;
 | |
|                     }
 | |
|                     Size s = GetMarkupSize(r.Width);
 | |
|                     r.Y = Math.Max(0, m_NCPainter.ClientRectangle.Y - s.Height - 4);
 | |
|                 }
 | |
|                 this.ClientTextRectangle = r;
 | |
|             }
 | |
|             else
 | |
|                 this.ClientTextRectangle = this.ClientRectangle;
 | |
|             
 | |
|             ResizeMarkup();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether text rectangle painted on panel is considering docked controls inside the panel. 
 | |
|         /// </summary>
 | |
|         [Browsable(false), DefaultValue(true), Category("Appearance"), Description("Indicates whether text rectangle painted on panel is considering docked controls inside the panel.")]
 | |
|         public override bool TextDockConstrained
 | |
|         {
 | |
|             get { return base.TextDockConstrained; }
 | |
|             set { base.TextDockConstrained = value; }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether panel automatically provides shadows for child controls. Default value is false.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DefaultValue(false), Category("Appearance"), Description("Indicates whether panel automatically provides shadows for child controls.")]
 | |
|         public bool IsShadowEnabled
 | |
|         {
 | |
|             get { return m_IsShadowEnabled; }
 | |
|             set
 | |
|             {
 | |
|                 if (m_IsShadowEnabled != value)
 | |
|                 {
 | |
|                     m_IsShadowEnabled = value;
 | |
|                     this.Invalidate();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Applies color scheme to the panel.
 | |
|         /// </summary>
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public void SetColorTable(ePanelColorTable colorScheme)
 | |
|         {
 | |
|             GroupPanel p = this;
 | |
|             DevComponents.DotNetBar.Rendering.ColorFactory factory = DevComponents.DotNetBar.Rendering.ColorFactory.Empty;
 | |
|             p.CanvasColor = SystemColors.Control;
 | |
|             p.ResetStyle();
 | |
|             p.ColorSchemeStyle = eDotNetBarStyle.Office2007;
 | |
| 
 | |
|             if (colorScheme == ePanelColorTable.Default)
 | |
|                 SetDefaultPanelStyle();
 | |
|             else if (colorScheme == ePanelColorTable.Green)
 | |
|             {
 | |
|                 p.Style.BackColor2 = factory.GetColor(0x9CBF8B);
 | |
|                 p.Style.BackColorGradientAngle = 90;
 | |
|                 p.Style.BackColor = factory.GetColor(0xC3D9B9);
 | |
|                 p.Style.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
 | |
|                 p.Style.BorderWidth = 1;
 | |
|                 p.Style.BorderColor = factory.GetColor(0x72A45A);
 | |
|                 p.Style.CornerDiameter = 4;
 | |
|                 p.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
 | |
|                 p.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
 | |
|                 p.Style.TextColor = factory.GetColor(0x3C4A1F);
 | |
|                 p.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near;
 | |
|             }
 | |
|             else if (colorScheme == ePanelColorTable.Orange)
 | |
|             {
 | |
|                 p.Style.BackColor = factory.GetColor(0xFAC08F);
 | |
|                 p.Style.BackColor2 = factory.GetColor(0xF79646);
 | |
|                 p.Style.BorderColor = factory.GetColor(0x974806);
 | |
|                 p.Style.TextColor = factory.GetColor(0x7F3D06);
 | |
|                 p.Style.BackColorGradientAngle = 90;
 | |
|                 p.Style.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
 | |
|                 p.Style.BorderWidth = 1;
 | |
|                 p.Style.CornerDiameter = 4;
 | |
|                 p.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
 | |
|                 p.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
 | |
|                 p.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near;
 | |
|             }
 | |
|             else if (colorScheme == ePanelColorTable.Red)
 | |
|             {
 | |
|                 p.Style.BackColor = factory.GetColor(0xE5BFBF);
 | |
|                 p.Style.BackColor2 = factory.GetColor(0xD39696);
 | |
|                 p.Style.BorderColor = factory.GetColor(0x953734);
 | |
|                 p.Style.TextColor = factory.GetColor(0x632423);
 | |
|                 p.Style.BackColorGradientAngle = 90;
 | |
|                 p.Style.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
 | |
|                 p.Style.BorderWidth = 1;
 | |
|                 p.Style.CornerDiameter = 4;
 | |
|                 p.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
 | |
|                 p.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
 | |
|                 p.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near;
 | |
|             }
 | |
|             else if (colorScheme == ePanelColorTable.Yellow)
 | |
|             {
 | |
|                 p.Style.BackColor = factory.GetColor(0xFFF3B2);
 | |
|                 p.Style.BackColor2 = factory.GetColor(0xFAD945);
 | |
|                 p.Style.BorderColor = factory.GetColor(0xEE9311);
 | |
|                 p.Style.TextColor = factory.GetColor(0x3F3F00);
 | |
|                 p.Style.BackColorGradientAngle = 90;
 | |
|                 p.Style.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
 | |
|                 p.Style.BorderWidth = 1;
 | |
|                 p.Style.CornerDiameter = 4;
 | |
|                 p.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
 | |
|                 p.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
 | |
|                 p.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near;
 | |
|             }
 | |
|             else if (colorScheme == ePanelColorTable.Magenta)
 | |
|             {
 | |
|                 p.Style.BackColor = factory.GetColor(0xEF91B4);
 | |
|                 p.Style.BackColor2 = factory.GetColor(0xE66896);
 | |
|                 p.Style.BorderColor = factory.GetColor(0xB12753);
 | |
|                 p.Style.TextColor = factory.GetColor(0x8E2648);
 | |
|                 p.Style.BackColorGradientAngle = 90;
 | |
|                 p.Style.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
 | |
|                 p.Style.BorderWidth = 1;
 | |
|                 p.Style.CornerDiameter = 4;
 | |
|                 p.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
 | |
|                 p.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
 | |
|                 p.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Applies default group panel style to the control.
 | |
|         /// </summary>
 | |
|         public void SetDefaultPanelStyle()
 | |
|         {
 | |
|             GroupPanel p = this;
 | |
| 
 | |
|             p.CanvasColor = SystemColors.Control;
 | |
|             p.ResetStyle();
 | |
|             p.ColorSchemeStyle = eDotNetBarStyle.Office2007;
 | |
|             p.Style.BackColor2SchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground2;
 | |
|             p.Style.BackColorGradientAngle = 90;
 | |
|             p.Style.BackColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground;
 | |
|             p.Style.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
 | |
|             p.Style.BorderWidth = 1;
 | |
|             p.Style.BorderColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBorder;
 | |
|             p.Style.CornerDiameter = 4;
 | |
|             p.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
 | |
|             p.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
 | |
|             p.Style.TextColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelText;
 | |
|             p.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near;
 | |
|         }
 | |
| 
 | |
|         protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
 | |
|         {
 | |
|             base.SetBoundsCore(x, y, width, height, specified);
 | |
| 
 | |
|             UpdateInternalClientSize(width, height, specified);
 | |
|         }
 | |
| 
 | |
|         protected override void OnTextChanged(EventArgs e)
 | |
|         {
 | |
|             if (IsHandleCreated)
 | |
|             {
 | |
|                 UpdateInternalClientSize(this.Width, this.Height, BoundsSpecified.Width | BoundsSpecified.Height);
 | |
|                 InvalidateNonClient();
 | |
|             }
 | |
|             base.OnTextChanged(e);
 | |
|         }
 | |
| 
 | |
|         private void UpdateInternalClientSize(int width, int height, BoundsSpecified specified)
 | |
|         {
 | |
|             if (((specified & BoundsSpecified.Height) == BoundsSpecified.Height || (specified & BoundsSpecified.Width) == BoundsSpecified.Width))
 | |
|             {
 | |
|                 ElementStyle style = this.Style;
 | |
|                 Rectangle r = new Rectangle(0, 0, width, height);
 | |
|                 if (m_NCPainter != null)
 | |
|                 {
 | |
|                     Rectangle cr = m_NCPainter.GetClientRectangleForBorderStyle(r, style);
 | |
|                     if ((specified & BoundsSpecified.Height) == BoundsSpecified.Height)
 | |
|                         height = cr.Height;
 | |
|                     if ((specified & BoundsSpecified.Width) == BoundsSpecified.Width)
 | |
|                         width = cr.Width;
 | |
| 
 | |
|                     Type type = typeof(Control);
 | |
|                     try // try with ignore catch is bad idea but in this case its for future proofing, just in case M$ removes these members
 | |
|                     {
 | |
|                         type.InvokeMember("clientWidth", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField, null, this, new object[] { width });
 | |
|                         type.InvokeMember("clientHeight", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField, null, this, new object[] { height });
 | |
|                     }
 | |
|                     catch { }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public override bool AutoScroll
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return base.AutoScroll;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 base.AutoScroll = value;
 | |
|             }
 | |
|         }
 | |
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public override Point AutoScrollOffset
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return base.AutoScrollOffset;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 base.AutoScrollOffset = value;
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region INonClientControl Members
 | |
| 
 | |
|         protected override void WndProc(ref System.Windows.Forms.Message m)
 | |
|         {
 | |
|             if (m_NCPainter == null)
 | |
|             {
 | |
|                 base.WndProc(ref m);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (m.Msg == (int)WinApi.WindowsMessages.WM_HSCROLL || m.Msg == (int)WinApi.WindowsMessages.WM_VSCROLL ||
 | |
|                 m.Msg == (int)WinApi.WindowsMessages.WM_MOUSEWHEEL)
 | |
|             {
 | |
|                 //Region reg = new Region(new Rectangle(0, 0, this.Width, this.Height));
 | |
|                 //SuspendPaint = true;
 | |
|                 //try
 | |
|                 //{
 | |
|                 bool callBase = m_NCPainter.WndProc(ref m);
 | |
|                 if (callBase)
 | |
|                     BaseWndProc(ref m);
 | |
|                 //}
 | |
|                 //finally
 | |
|                 //{
 | |
|                 //SuspendPaint = false;
 | |
|                 //}
 | |
|                 //foreach (Control c in this.Controls)
 | |
|                 //{
 | |
|                 //    if (c.Visible)
 | |
|                 //        reg.Exclude(c.Bounds);
 | |
|                 //}
 | |
|                 RefreshTextClientRectangle();
 | |
|                 //this.Invalidate(reg, false);
 | |
|                 //if (this.Controls.Count > 0)
 | |
|                 //    this.Update();
 | |
|                 //reg.Dispose();
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 bool callBase = m_NCPainter.WndProc(ref m);
 | |
|                 //if (m.Msg == (int)WinApi.WindowsMessages.WM_NCCALCSIZE)
 | |
|                 //    UpdateInternalClientSize(this.Width, this.Height, BoundsSpecified.Width | BoundsSpecified.Height);
 | |
|                 if (callBase)
 | |
|                     BaseWndProc(ref m);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void INonClientControl.BaseWndProc(ref Message m)
 | |
|         {
 | |
|             BaseWndProc(ref m);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns the renderer control will be rendered with.
 | |
|         /// </summary>
 | |
|         /// <returns>The current renderer.</returns>
 | |
|         public virtual Rendering.BaseRenderer GetRenderer()
 | |
|         {
 | |
|             if (Rendering.GlobalManager.Renderer != null)
 | |
|                 return Rendering.GlobalManager.Renderer;
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         ItemPaintArgs INonClientControl.GetItemPaintArgs(System.Drawing.Graphics g)
 | |
|         {
 | |
|             ItemPaintArgs pa = new ItemPaintArgs(this as IOwner, this, g, GetColorScheme());
 | |
|             pa.Renderer = this.GetRenderer();
 | |
|             pa.DesignerSelection = false; // m_DesignerSelection;
 | |
|             pa.GlassEnabled = !this.DesignMode && WinApi.IsGlassEnabled;
 | |
|             return pa;
 | |
|         }
 | |
| 
 | |
|         ElementStyle INonClientControl.BorderStyle
 | |
|         {
 | |
|             get { return this.Style; }
 | |
|         }
 | |
| 
 | |
|         void INonClientControl.PaintBackground(PaintEventArgs e)
 | |
|         {
 | |
|             base.OnPaintBackground(e);
 | |
|         }
 | |
| 
 | |
|         IntPtr INonClientControl.Handle
 | |
|         {
 | |
|             get { return this.Handle; }
 | |
|         }
 | |
| 
 | |
|         int INonClientControl.Width
 | |
|         {
 | |
|             get { return this.Width; }
 | |
|         }
 | |
| 
 | |
|         int INonClientControl.Height
 | |
|         {
 | |
|             get { return this.Height; }
 | |
|         }
 | |
| 
 | |
|         bool INonClientControl.IsHandleCreated
 | |
|         {
 | |
|             get { return this.IsHandleCreated; }
 | |
|         }
 | |
| 
 | |
|         System.Drawing.Point INonClientControl.PointToScreen(System.Drawing.Point client)
 | |
|         {
 | |
|             return this.PointToScreen(client);
 | |
|         }
 | |
| 
 | |
|         System.Drawing.Color INonClientControl.BackColor
 | |
|         {
 | |
|             get { return this.BackColor; }
 | |
|         }
 | |
| 
 | |
|         void DevComponents.DotNetBar.Controls.INonClientControl.RenderNonClient(Graphics g) { }
 | |
| 
 | |
|         void DevComponents.DotNetBar.Controls.INonClientControl.AdjustClientRectangle(ref Rectangle r)
 | |
|         {
 | |
|             Size textSize = GetAutoSize(r.Width);
 | |
|             if (m_TitleImage != null)
 | |
|             {
 | |
|                 textSize.Height = Math.Max(m_TitleImage.Height, textSize.Height);
 | |
|             }
 | |
|             if (textSize.Height > r.Height) textSize.Height = r.Height - 8;
 | |
|             r.Y += textSize.Height;
 | |
|             r.Height -= textSize.Height;
 | |
|         }
 | |
| 
 | |
|         void INonClientControl.AdjustBorderRectangle(ref Rectangle r)
 | |
|         {
 | |
|             if (this.Text != "")
 | |
|             {
 | |
|                 int h = GetNonClientTopHeight();
 | |
|                 r.Y += h;
 | |
|                 r.Height -= h;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private int GetNonClientTopHeight()
 | |
|         {
 | |
|             Font f = this.Font;
 | |
|             if (this.Style.Font != null)
 | |
|                 f = this.Style.Font;
 | |
|             int h = (int)(f.Height * .7f);
 | |
|             if (m_TitleImage != null)
 | |
|             {
 | |
|                 h = Math.Max(m_TitleImage.Height - (f.Height - h - 1), h);
 | |
|             }
 | |
|             return h;
 | |
|         }
 | |
|         internal Rectangle GetInternalClientRectangle()
 | |
|         {
 | |
|             return m_NCPainter.ClientRectangle;
 | |
|         }
 | |
|         private Color _DisabledBackColor = Color.Empty;
 | |
|         /// <summary>
 | |
|         /// Specifies back color when Enabled=false
 | |
|         /// </summary>
 | |
|         [Browsable(false), Category("Appearance"), Description("Specifies back color when Enabled=false")]
 | |
|         public Color DisabledBackColor
 | |
|         {
 | |
|             get { return _DisabledBackColor; }
 | |
|             set
 | |
|             {
 | |
|                 _DisabledBackColor = value;
 | |
|                 if (!Enabled) this.Invalidate();
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
|     /// <summary>
 | |
|     /// Defines predefined color schemes for panel control.
 | |
|     /// </summary>
 | |
|     public enum ePanelColorTable
 | |
|     {
 | |
|         Default,
 | |
|         Green,
 | |
|         Orange,
 | |
|         Red,
 | |
|         Yellow,
 | |
|         Magenta
 | |
|     }
 | |
| }
 |