806 lines
36 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Drawing;
namespace DevComponents.DotNetBar.Layout
{
[Designer("DevComponents.DotNetBar.Layout.Design.LayoutGroupDesigner, DevComponents.DotNetBar.Layout.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=7eb7c3a35b91de04")]
public class LayoutGroup : LayoutItemBase
{
#region Constructor
/// <summary>
/// Initializes a new instance of the LayoutGroup class.
/// </summary>
public LayoutGroup()
{
_CaptionStyle = new SimpleStyle();
_CaptionStyle.PropertyChanged += CaptionStylePropertyChanged;
_Items = new LayoutItemCollection();
_Items.SetParentItem(this);
}
protected override void OnDispose()
{
_CaptionStyle.PropertyChanged -= CaptionStylePropertyChanged;
base.OnDispose();
}
#endregion
#region Implementation
private Rectangle _ActualBounds = Rectangle.Empty;
/// <summary>
/// Gets actual bounds of elements inside of group. The actual bounds may differ from requested layout bounds due to minium
/// size constraint.
/// </summary>
internal Rectangle ActualBounds
{
get
{
return _ActualBounds;
}
set
{
_ActualBounds = value;
}
}
protected override void OnPaint(PaintContext context)
{
OnPaintBackground(context);
if (!_CaptionBounds.IsEmpty)
{
bool isImageVisible = this.IsImageVisible;
Graphics g = context.Graphics;
//context.Graphics.FillRectangle(Brushes.Aqua, _CaptionBounds);
Color textColor = context.LabelTextColor;
bool dispose = false;
Brush textBrush = context.LabelTextBrush;
if (_Appearance == eGroupAppearance.Panel)
{
textColor = PaintPanelCaption(context);
textBrush = new SolidBrush(textColor);
dispose = true;
}
else if (_Appearance == eGroupAppearance.GroupPanel)
{
textColor = PaintGroupPanelCaption(context);
textBrush = new SolidBrush(textColor);
dispose = true;
}
else if (_CaptionStyle.IsPainted)
{
DrawingHelpers.PaintStyle(g, _CaptionStyle, _CaptionBounds);
}
if (!_CaptionStyle.TextColor.IsEmpty)
{
textColor = _CaptionStyle.TextColor;
textBrush = new SolidBrush(textColor);
dispose = true;
}
if (this.TextPosition == eLayoutPosition.Top || this.TextPosition == eLayoutPosition.Bottom)
{
PaintText(context, isImageVisible, textColor, ActualTextBounds, textBrush);
}
else
{
// Rotate rendering
g.RotateTransform(-90);
//Rectangle r = new Rectangle(_CaptionBounds.Top, -_CaptionBounds.Right, _CaptionBounds.Height, _CaptionBounds.Width);
//Rectangle r = new Rectangle(-_CaptionBounds.Bottom, _CaptionBounds.X, _CaptionBounds.Height, _CaptionBounds.Width);
Rectangle r = new Rectangle(-ActualTextBounds.Bottom, ActualTextBounds.X, ActualTextBounds.Height, ActualTextBounds.Width);
PaintText(context, isImageVisible, textColor, r, textBrush);
g.ResetTransform();
}
if (dispose)
textBrush.Dispose();
if (isImageVisible)
PaintImage(context, textColor);
}
foreach (LayoutItemBase item in _Items)
{
if (!item.Visible) continue;
item.Paint(context);
}
//context.Graphics.DrawRectangle(Pens.Green, ActualBounds);
}
private Color PaintPanelCaption(PaintContext context)
{
Rectangle bounds = _CaptionBounds;
if (!this.CaptionStyle.Margin.IsEmpty)
bounds = Helpers.Deflate(bounds, this.CaptionStyle.Margin);
Graphics g = context.Graphics;
DevComponents.DotNetBar.Rendering.Office2007ColorTable table = ((DevComponents.DotNetBar.Rendering.Office2007Renderer)DevComponents.DotNetBar.Rendering.GlobalManager.Renderer).ColorTable;
Color border = table.LegacyColors.PanelBorder;
Color back1 = table.LegacyColors.PanelBackground;
Color back2 = table.LegacyColors.PanelBackground2;
Color textColor = table.LegacyColors.PanelText;
int backAngle = table.LegacyColors.PanelBackgroundGradientAngle;
PaintRectangle(bounds, g, border, back1, back2, backAngle);
return textColor;
}
private Color PaintGroupPanelCaption(PaintContext context)
{
Rectangle r = _CaptionBounds;
Graphics g = context.Graphics;
ElementStyleDisplayInfo info = new ElementStyleDisplayInfo(_GroupPanelStyle, g, r);
ElementStyleDisplay.Paint(info);
return _GroupPanelStyle.TextColor;
}
const int CaptionEdgeDistance = 4;
private Rectangle GetGroupPanelCaptionBounds(Rectangle r)
{
eLayoutPosition textPosition = TextPosition;
eTextAlignment textAlignment = TextAlignment;
Size imageSize = GetImageSize();
if (!imageSize.IsEmpty) imageSize.Width += this.ImageTextSpacing;
int captionWidth = this.RealTextSize.Width + TextPadding.Horizontal + imageSize.Width;
if (textPosition == eLayoutPosition.Top || textPosition == eLayoutPosition.Bottom)
{
if (textAlignment == eTextAlignment.Left || textAlignment == eTextAlignment.Default)
{
r.Width = captionWidth;
r.X += CaptionEdgeDistance;
}
else if (textAlignment == eTextAlignment.Right)
{
r.X = r.Right - (captionWidth) - CaptionEdgeDistance;
r.Width = captionWidth;
}
else if (textAlignment == eTextAlignment.Center)
{
r.X += (r.Width - captionWidth) / 2;
r.Width = captionWidth;
}
}
else // Left/Right
{
if (textAlignment == eTextAlignment.Left || textAlignment == eTextAlignment.Default)
{
r.Y = r.Bottom - captionWidth - CaptionEdgeDistance;
r.Height = captionWidth;
}
else if (textAlignment == eTextAlignment.Right)
{
r.Height = captionWidth;
r.Y += CaptionEdgeDistance;
}
else if (textAlignment == eTextAlignment.Center)
{
r.Y += (r.Height - captionWidth) / 2;
r.Height = captionWidth;
}
}
return r;
}
/// <summary>
/// Paints the background of the item.
/// </summary>
/// <param name="context"></param>
protected override void OnPaintBackground(PaintContext context)
{
if (_Appearance == eGroupAppearance.Panel)
PaintPanelBackground(context);
else if (_Appearance == eGroupAppearance.GroupPanel)
PaintGroupPanelBackground(context);
else
base.OnPaintBackground(context);
}
private void PaintPanelBackground(PaintContext context)
{
Rectangle bounds = this.Bounds;
if (!this.Style.Margin.IsEmpty)
bounds = Helpers.Deflate(bounds, this.Style.Margin);
Graphics g = context.Graphics;
DevComponents.DotNetBar.Rendering.Office2007ColorTable table = ((DevComponents.DotNetBar.Rendering.Office2007Renderer)DevComponents.DotNetBar.Rendering.GlobalManager.Renderer).ColorTable;
Color border = table.LegacyColors.PanelBorder;
Color back1 = table.LegacyColors.PanelBackground;
Color back2 = table.LegacyColors.PanelBackground2;
int backAngle = table.LegacyColors.PanelBackgroundGradientAngle;
PaintRectangle(bounds, g, border, back1, back2, backAngle);
}
private static void PaintRectangle(Rectangle bounds, Graphics g, Color border, Color back1, Color back2, int backAngle)
{
if (bounds.Width <= 0 || bounds.Height <= 0)
return;
if (back2.IsEmpty)
{
if (!back1.IsEmpty)
{
using (SolidBrush brush = new SolidBrush(back1))
g.FillRectangle(brush, bounds);
}
}
else
{
using (System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(bounds, back1, back2, backAngle))
g.FillRectangle(brush, bounds);
}
if (!border.IsEmpty)
{
Rectangle borderBounds = bounds;
borderBounds.Width--; borderBounds.Height--;
using (Pen pen = new Pen(border))
g.DrawRectangle(pen, borderBounds);
}
}
private ElementStyle _GroupPanelStyle = null;
private void PaintGroupPanelBackground(PaintContext context)
{
InitializeGroupPanelStyle();
DevComponents.DotNetBar.Rendering.Office2007ColorTable table = ((DevComponents.DotNetBar.Rendering.Office2007Renderer)DevComponents.DotNetBar.Rendering.GlobalManager.Renderer).ColorTable;
_GroupPanelStyle.SetColorScheme(table.LegacyColors);
Rectangle bounds = this.Bounds;
if (!_CaptionBounds.IsEmpty)
{
eLayoutPosition tp = this.TextPosition;
if (tp == eLayoutPosition.Top)
{
bounds.Y += _CaptionBounds.Height / 2;
bounds.Height -= _CaptionBounds.Height / 2;
}
else if (tp == eLayoutPosition.Bottom)
bounds.Height -= _CaptionBounds.Height / 2;
else if (tp == eLayoutPosition.Left || tp == eLayoutPosition.Default)
{
bounds.X += _CaptionBounds.Width / 2;
bounds.Width -= _CaptionBounds.Width / 2;
}
else // Right
bounds.Width -= _CaptionBounds.Width / 2;
}
if (!this.Style.Margin.IsEmpty)
bounds = Helpers.Deflate(bounds, this.Style.Margin);
Graphics g = context.Graphics;
ElementStyleDisplayInfo info = new ElementStyleDisplayInfo(_GroupPanelStyle, g, bounds);
ElementStyleDisplay.Paint(info);
}
private void InitializeGroupPanelStyle()
{
if (_GroupPanelStyle != null) return;
_GroupPanelStyle = new ElementStyle();
_GroupPanelStyle.BackColorSchemePart = eColorSchemePart.PanelBackground;
_GroupPanelStyle.BackColor2SchemePart = eColorSchemePart.PanelBackground2;
_GroupPanelStyle.BorderColorSchemePart = eColorSchemePart.PanelBorder;
_GroupPanelStyle.BackColorGradientAngle = 90;
_GroupPanelStyle.CornerDiameter = 4;
_GroupPanelStyle.BorderWidth = 1;
_GroupPanelStyle.Border = DevComponents.DotNetBar.eStyleBorderType.Solid;
_GroupPanelStyle.CornerType = DevComponents.DotNetBar.eCornerType.Rounded;
_GroupPanelStyle.TextColorSchemePart = eColorSchemePart.PanelText;
}
protected override void OnUpdateLayout()
{
base.OnUpdateLayout();
}
private Rectangle _ContentBounds = Rectangle.Empty;
private ItemLayout _Layout = new ItemLayout();
/// <summary>
/// Performs group layout.
/// </summary>
/// <param name="context">Layout context information.</param>
public void Layout(LayoutContext context)
{
Rectangle r = this.Bounds;
// Calculate text-position
r = LayoutGroupCaption(context, r);
if (!_IsRootGroup)
r = Helpers.Deflate(r, this.Padding);
_ContentBounds = r;
_Layout.Layout(this, r, context);
}
private int _CaptionHeight = 0;
/// <summary>
/// Indicates explicit caption height in pixels.
/// </summary>
[DefaultValue(0), Category("Appearance"), Description("Indicates caption height in pixels.")]
public int CaptionHeight
{
get { return _CaptionHeight; }
set
{
if (value != _CaptionHeight)
{
int oldValue = _CaptionHeight;
_CaptionHeight = value;
OnCaptionHeightChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when CaptionHeight property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnCaptionHeightChanged(int oldValue, int newValue)
{
this.InvalidateLayout();
OnPropertyChanged(new PropertyChangedEventArgs("CaptionHeight"));
}
protected override Font GetTextFont(Font defaultFont)
{
Font font = defaultFont;
if (_CaptionStyle.Font != null)
font = _CaptionStyle.Font;
return font;
}
/// <summary>
/// Updates the layout of the text inside of item.
/// </summary>
protected override void UpdateTextBounds()
{
if (_CaptionBounds.IsEmpty) return;
Rectangle actualTextBounds = Helpers.Deflate(_CaptionBounds, this.TextPadding);
Rectangle actualImageBounds = Rectangle.Empty;
bool isImageVisible = IsImageVisible;
Size imageSize = Size.Empty;
if (isImageVisible)
imageSize = GetImageSize();
eTextAlignment textAlignment = this.TextAlignment;
Size realTextSize = this.RealTextSize;
if (isImageVisible)
{
eLayoutPosition imagePosition = ImagePosition;
int imageTextSpacing = ImageTextSpacing;
if (TextPosition == eLayoutPosition.Top || TextPosition == eLayoutPosition.Bottom)
{
if (imagePosition == eLayoutPosition.Default || imagePosition == eLayoutPosition.Right)
{
if (textAlignment == eTextAlignment.Right)
actualImageBounds = new Rectangle(actualTextBounds.Right - imageSize.Width - imageTextSpacing, actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
else if (textAlignment == eTextAlignment.Center)
{
if (Appearance == eGroupAppearance.GroupPanel)
{
actualImageBounds = new Rectangle(actualTextBounds.Right - (imageSize.Width + CaptionEdgeDistance), actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
actualTextBounds.Width = realTextSize.Width;
}
else
actualImageBounds = new Rectangle(actualTextBounds.X + actualTextBounds.Width / 2 + realTextSize.Width / 2 + this.ImageTextSpacing, actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
}
else
{
actualImageBounds = new Rectangle(actualTextBounds.X + imageTextSpacing + realTextSize.Width, actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
if (Appearance == eGroupAppearance.GroupPanel)
actualImageBounds.X -= CaptionEdgeDistance;
}
}
else if (imagePosition == eLayoutPosition.Left)
{
if (textAlignment == eTextAlignment.Right)
{
actualImageBounds = new Rectangle(actualTextBounds.Right - (realTextSize.Width + imageSize.Width + imageTextSpacing), actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
if (Appearance == eGroupAppearance.GroupPanel)
actualImageBounds.X += CaptionEdgeDistance;
}
else if (textAlignment == eTextAlignment.Center)
{
if (Appearance == eGroupAppearance.GroupPanel)
{
actualImageBounds = new Rectangle(actualTextBounds.X + CaptionEdgeDistance, actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
actualTextBounds.X = actualImageBounds.Right;
actualTextBounds.Width = realTextSize.Width;
}
else
actualImageBounds = new Rectangle(actualTextBounds.X + actualTextBounds.Width / 2 - (realTextSize.Width / 2 + this.ImageTextSpacing + imageSize.Width), actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
}
else
{
actualImageBounds = new Rectangle(actualTextBounds.X, actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height);
actualTextBounds.X += actualImageBounds.Width + imageTextSpacing;
actualTextBounds.Width -= actualImageBounds.Width + imageTextSpacing;
}
}
else if (imagePosition == eLayoutPosition.Top)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2,
actualTextBounds.Y - (imageSize.Height + imageTextSpacing),
imageSize.Width,
imageSize.Height);
}
else if (imagePosition == eLayoutPosition.Bottom)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2,
actualTextBounds.Bottom + imageTextSpacing,
imageSize.Width,
imageSize.Height);
}
}
else
{
if (imagePosition == eLayoutPosition.Default || imagePosition == eLayoutPosition.Right)
{
if (textAlignment == eTextAlignment.Right)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Y + imageTextSpacing, imageSize.Width, imageSize.Height);
actualTextBounds.Y += imageTextSpacing;
actualImageBounds.Height -= imageTextSpacing;
if (Appearance == eGroupAppearance.GroupPanel)
{
actualTextBounds.Y = actualImageBounds.Bottom - 10;
actualTextBounds.Height = (_CaptionBounds.Bottom - actualTextBounds.Y)+4;
}
}
else if (textAlignment == eTextAlignment.Center)
{
if (Appearance == eGroupAppearance.GroupPanel)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Y + CaptionEdgeDistance, imageSize.Width, imageSize.Height);
actualTextBounds.Y = actualImageBounds.Bottom;
actualTextBounds.Height = _CaptionBounds.Bottom - actualTextBounds.Y;
}
else
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Y + actualTextBounds.Height / 2 - (realTextSize.Width / 2 + imageTextSpacing + imageSize.Height), imageSize.Width, imageSize.Height);
}
else
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Bottom - (realTextSize.Width + imageTextSpacing + imageSize.Height), imageSize.Width, imageSize.Height);
if (Appearance == eGroupAppearance.GroupPanel)
actualImageBounds.Y += CaptionEdgeDistance;
}
}
else if (imagePosition == eLayoutPosition.Left)
{
if (textAlignment == eTextAlignment.Right)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Y + imageTextSpacing, imageSize.Width, imageSize.Height);
actualTextBounds.Y += imageTextSpacing;
actualImageBounds.Height -= imageTextSpacing;
if (Appearance == eGroupAppearance.GroupPanel)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Bottom - (CaptionEdgeDistance+imageSize.Width), imageSize.Width, imageSize.Height);
actualTextBounds.Height = actualImageBounds.Y - _CaptionBounds.Y;
}
}
else if (textAlignment == eTextAlignment.Center)
{
if (Appearance == eGroupAppearance.GroupPanel)
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Bottom - (imageSize.Height + CaptionEdgeDistance), imageSize.Width, imageSize.Height);
actualTextBounds.Height -= realTextSize.Height;
}
else
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Y + actualTextBounds.Height / 2 + realTextSize.Width / 2 + this.ImageTextSpacing, imageSize.Width, imageSize.Height);
}
else
{
actualImageBounds = new Rectangle(actualTextBounds.X + (actualTextBounds.Width - imageSize.Width) / 2, actualTextBounds.Bottom - imageSize.Height - imageTextSpacing, imageSize.Width, imageSize.Height);
actualTextBounds.Height -= actualImageBounds.Height + imageTextSpacing;
}
}
else if (imagePosition == eLayoutPosition.Top)
{
actualImageBounds = new Rectangle(actualTextBounds.X + imageTextSpacing,
actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2,
imageSize.Width,
imageSize.Height);
actualTextBounds.X += imageSize.Width + imageTextSpacing;
actualTextBounds.Width -= imageSize.Width + imageTextSpacing;
}
else if (imagePosition == eLayoutPosition.Bottom)
{
actualImageBounds = new Rectangle(actualTextBounds.Right - (imageSize.Width + imageTextSpacing),
actualTextBounds.Y + (actualTextBounds.Height - imageSize.Height) / 2,
imageSize.Width,
imageSize.Height);
actualTextBounds.Width -= imageSize.Width + imageTextSpacing;
}
}
}
this.ActualTextBounds = actualTextBounds;
this.ActualImageBounds = actualImageBounds;
}
private Rectangle _CaptionBounds = Rectangle.Empty;
protected virtual Rectangle LayoutGroupCaption(LayoutContext context, Rectangle r)
{
_CaptionBounds = Rectangle.Empty;
if (string.IsNullOrEmpty(this.Text) || !this.TextVisible)
return r;
eLayoutPosition textPosition = this.TextPosition;
Size textSize = new Size();
if (_CaptionHeight > 0)
{
textSize.Width = r.Width;
textSize.Height = _CaptionHeight;
}
else
{
textSize = MeasureText(context);
if (IsImageVisible)
{
Size imageSize = GetImageSize();
textSize.Height = Math.Max(textSize.Height, imageSize.Height);
}
}
if (textPosition == eLayoutPosition.Top)
{
_CaptionBounds = new Rectangle(r.X, r.Y, r.Width, textSize.Height);
r.Y += _CaptionBounds.Height;
r.Height -= _CaptionBounds.Height;
}
else if (textPosition == eLayoutPosition.Bottom)
{
_CaptionBounds = new Rectangle(r.X, r.Bottom - textSize.Height, r.Width, textSize.Height);
r.Height -= _CaptionBounds.Height;
}
else if (textPosition == eLayoutPosition.Left || textPosition == eLayoutPosition.Default) // Text rotated to the side
{
_CaptionBounds = new Rectangle(r.X, r.Y, textSize.Height, r.Height);
r.X += _CaptionBounds.Width;
r.Width -= _CaptionBounds.Width;
}
else if (textPosition == eLayoutPosition.Right) // Text rotated to the side
{
_CaptionBounds = new Rectangle(r.Right - textSize.Height, r.Y, textSize.Height, r.Height);
r.Width -= _CaptionBounds.Width;
}
if (Appearance == eGroupAppearance.GroupPanel)
_CaptionBounds = GetGroupPanelCaptionBounds(_CaptionBounds);
UpdateTextBounds();
//if (Appearance == eGroupAppearance.GroupPanel && !ActualImageBounds.IsEmpty)
//{
// if (textPosition == eLayoutPosition.Top || textPosition == eLayoutPosition.Bottom || textPosition == eLayoutPosition.Default)
// {
// if (TextAlignment != eTextAlignment.Center)
// ActualImageBounds = new Rectangle(ActualImageBounds.X + CaptionEdgeDistance, ActualImageBounds.Y, ActualImageBounds.Width, ActualImageBounds.Height);
// }
// else
// {
// ActualImageBounds = new Rectangle(ActualImageBounds.X, ActualImageBounds.Y + CaptionEdgeDistance, ActualImageBounds.Width, ActualImageBounds.Height);
// }
//}
return r;
}
private LayoutItemCollection _Items = null;
/// <summary>
/// Gets the collection of layout items objects assigned to the current group.
/// </summary>
[Browsable(true), Category("Items"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public LayoutItemCollection Items
{
get
{
return _Items;
}
}
//private eLayoutType _LayoutType = eLayoutType.Horizontal;
///// <summary>
///// Indicates layout type performed by the group.
///// </summary>
//[DefaultValue(eLayoutType.Horizontal), Category("Appearance"), Description("Indicates layout type performed by the group.")]
//public eLayoutType LayoutType
//{
// get { return _LayoutType; }
// set
// {
// if (value != _LayoutType)
// {
// eLayoutType oldValue = _LayoutType;
// _LayoutType = value;
// OnLayoutTypeChanged(oldValue, value);
// }
// }
//}
///// <summary>
///// Called when LayoutType property has changed.
///// </summary>
///// <param name="oldValue">Old property value</param>
///// <param name="newValue">New property value</param>
//protected virtual void OnLayoutTypeChanged(eLayoutType oldValue, eLayoutType newValue)
//{
// OnPropertyChanged(new PropertyChangedEventArgs("LayoutType"));
//}
internal override void UpdateScrollBounds(int xScroll, int yScroll, bool moveControls)
{
base.UpdateScrollBounds(xScroll, yScroll, moveControls);
_ActualBounds.Offset(xScroll, yScroll);
_CaptionBounds.Offset(xScroll, yScroll);
_ContentBounds.Offset(xScroll, yScroll);
foreach (LayoutItemBase item in this.Items)
{
item.UpdateScrollBounds(xScroll, yScroll, moveControls);
}
}
private bool _IsRootGroup = false;
/// <summary>
/// Indicates whether group is used as a root group in LayoutControl.
/// </summary>
[Browsable(false)]
public bool IsRootGroup
{
get { return _IsRootGroup; }
internal set
{
if (_IsRootGroup == value)
return;
_IsRootGroup = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsRootGroup"));
}
}
private SimpleStyle _CaptionStyle;
/// <summary>
/// Gets the style for the group caption represented by Text property.
/// </summary>
[Browsable(true), Category("Appearance"), Description("Gets the style for the group caption represented by Text property"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public SimpleStyle CaptionStyle
{
get { return _CaptionStyle; }
}
private void CaptionStylePropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.Invalidate();
//throw new Exception("The method or operation is not implemented.");
}
/// <summary>
/// Returns whether item is contained as child item by this item or one of its children.
/// </summary>
/// <param name="value">Item to check.</param>
/// <returns>true if item is contained otherwise false</returns>
public override bool IsChildItem(LayoutItemBase value)
{
foreach (LayoutItemBase item in _Items)
{
if (item == value) return true;
if (item.IsChildItem(value)) return true;
}
return false;
}
private eGroupAppearance _Appearance = eGroupAppearance.None;
/// <summary>
/// Indicates the built-in appearance of group. When set group is painted using one of the pre-defined styles.
/// When set to None, default value, you can use Style and CaptionStyle properties to change the group appearance.
/// </summary>
[DefaultValue(eGroupAppearance.None), Category("Appearance"), Description("Indicates the built-in appearance of group.")]
public eGroupAppearance Appearance
{
get { return _Appearance; }
set
{
if (value != _Appearance)
{
eGroupAppearance oldValue = _Appearance;
_Appearance = value;
OnAppearanceChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when Appearance property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnAppearanceChanged(eGroupAppearance oldValue, eGroupAppearance newValue)
{
this.Invalidate();
this.InvalidateLayout();
OnPropertyChanged(new PropertyChangedEventArgs("Appearance"));
}
/// <summary>
/// Scales item in response to the scaling of the LayoutControl. Should never be called directly.
/// </summary>
/// <param name="factor"></param>
[EditorBrowsable(EditorBrowsableState.Never)]
public override void ScaleItem(SizeF factor)
{
base.ScaleItem(factor);
if (_CaptionHeight > 0)
{
bool widthChanged = factor.Width != 1f;
bool heightChanged = factor.Height != 1f;
if (heightChanged)
{
_CaptionHeight = (int)(_CaptionHeight * factor.Height);
}
}
}
/// <summary>
/// Gets whether this item text-size is shared with other items inside of its parent group.
/// </summary>
[Browsable(false)]
public override bool IsTextSizeShared
{
get
{
return false;
}
}
/// <summary>
/// Gets whether this item's text-baseline is shared with other items inside of its parent group.
/// </summary>
[Browsable(false)]
public override bool IsTextBaselineShared
{
get
{
return false;
}
}
protected override void OnVisibleChanged(bool oldValue, bool newValue)
{
foreach (LayoutItemBase item in _Items)
{
item.Visible = newValue;
}
base.OnVisibleChanged(oldValue, newValue);
}
#endregion
}
/// <summary>
/// Specifies the layout type.
/// </summary>
public enum eLayoutType
{
/// <summary>
/// Horizontal layout type where items are first ordered from left to right then wrapped to next line.
/// </summary>
Horizontal,
/// <summary>
/// Vertical layout type where items are ordered first from top to bottom then wrapped onto the next column.
/// </summary>
Vertical
}
/// <summary>
/// Specifies built-in appearance for the LayoutGroup.
/// </summary>
public enum eGroupAppearance
{
/// <summary>
/// Group does not use any built-in appearance.
/// </summary>
None,
/// <summary>
/// Group is rendered like standard DotNetBar Panel control.
/// </summary>
Panel,
/// <summary>
/// Group is rendered like GroupPanel control.
/// </summary>
GroupPanel
}
}