2483 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			2483 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.ComponentModel;
 | ||
| using System.Drawing;
 | ||
| using System.Drawing.Design;
 | ||
| using System.Drawing.Drawing2D;
 | ||
| using System.Windows.Forms;
 | ||
| using DevComponents.Charts.TextMarkup;
 | ||
| using DevComponents.DotNetBar.Charts.Style;
 | ||
| 
 | ||
| namespace DevComponents.DotNetBar.Charts
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// Represents the collection of ChartContainer objects.
 | ||
|     /// </summary>
 | ||
|     [Editor("DevComponents.Charts.Design.ChartContainerCollectionEditor, DevComponents.Charts.Design, " +
 | ||
|             "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | ||
|     public class ChartContainerCollection : CustomNamedCollection<ChartContainer>
 | ||
|     {
 | ||
|         public ChartContainerCollection()
 | ||
|         {
 | ||
|         }
 | ||
| 
 | ||
|         #region GetUniqueName
 | ||
| 
 | ||
|         public string GetUniqueName()
 | ||
|         {
 | ||
|             return (GetUniqueName("ChartCont"));
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
|     }
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// ChartContainer
 | ||
|     /// </summary>
 | ||
|     public class ChartContainer : ChartVisualElement, ILegendData, IScrollable, IComparable
 | ||
|     {
 | ||
|         #region Private variables
 | ||
| 
 | ||
|         private States _States;
 | ||
| 
 | ||
|         private string _EmptyText;
 | ||
|         private BodyElement _EmptyTextMarkup;
 | ||
|         private ChartLegend _Legend;
 | ||
| 
 | ||
|         private ChartTitleCollection _Titles;
 | ||
| 
 | ||
|         private ScrollBarLite _VScrollBar;
 | ||
|         private ScrollBarLite _HScrollBar;
 | ||
| 
 | ||
|         private int _VScrollBarWidth = 9;
 | ||
|         private int _HScrollBarHeight = 9;
 | ||
| 
 | ||
|         private Rectangle _FrameBounds;         // Margin
 | ||
|         private Rectangle _ContentBounds;       // Content - chart container(s)
 | ||
|         private Rectangle _ContentBoundsEx;     // Content - extended content bounds
 | ||
| 
 | ||
|         private int _FillWeight = 100;
 | ||
|         private AutoSizeMode _AutoSizeMode = AutoSizeMode.NotSet;
 | ||
|         private Size _MinContentSize = new Size(100, 100);
 | ||
| 
 | ||
|         private Timer _AutoScrollTimer;
 | ||
|         private AutoScrollEnable _AutoScrollEnable;
 | ||
|         private Rectangle _ScrollRect;
 | ||
| 
 | ||
|         private bool _Panning;
 | ||
| 
 | ||
|         private int _HPanOffset;
 | ||
|         private int _VPanOffset;
 | ||
| 
 | ||
|         private ItemHitArea _HitArea;
 | ||
|         private ItemHitArea _MouseDownHitArea;
 | ||
| 
 | ||
|         private ContainerVisualStyles _ContainerVisualStyles;
 | ||
|         private EffectiveStyles<ContainerVisualStyle> _EffectiveContainerStyles;
 | ||
| 
 | ||
|         private int _MatrixDisplayOrder;
 | ||
|         private Rectangle _MatrixDisplayBounds;
 | ||
| 
 | ||
|         private int _SelectionUpdateCount = -1;
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         public ChartContainer()
 | ||
|         {
 | ||
|             InitDefaultStates();
 | ||
| 
 | ||
|             SetupScrollBars();
 | ||
| 
 | ||
|             _EffectiveContainerStyles = new EffectiveStyles<ContainerVisualStyle>(this);
 | ||
|         }
 | ||
| 
 | ||
|         #region InitDefaultStates
 | ||
| 
 | ||
|         private void InitDefaultStates()
 | ||
|         {
 | ||
|             SetState(States.AutoGenSeriesCollection, true);
 | ||
|             SetState(States.EnablePanning, true);
 | ||
| 
 | ||
|             SetState(States.HScrollBarVisible, true);
 | ||
|             SetState(States.VScrollBarVisible, true);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Public properties
 | ||
| 
 | ||
|         #region AutoSizeMode
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets the mode used to size the container (by FillWeight, etc).
 | ||
|         ///</summary>
 | ||
|         [DefaultValue(AutoSizeMode.NotSet), Category("Layout")]
 | ||
|         [Description("Indicates the mode used to size the container (by FillWeight, etc).")]
 | ||
|         public AutoSizeMode AutoSizeMode
 | ||
|         {
 | ||
|             get { return (_AutoSizeMode); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _AutoSizeMode)
 | ||
|                 {
 | ||
|                     _AutoSizeMode = value;
 | ||
| 
 | ||
|                     OnPropertyChangedEx("AutoSizeMode", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ContainerVisualStyles
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets the visual styles for the container.
 | ||
|         /// </summary>
 | ||
|         [Category("Style")]
 | ||
|         [Description("Indicates the visual styles for the container.")]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | ||
|         public ContainerVisualStyles ContainerVisualStyles
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 if (_ContainerVisualStyles == null)
 | ||
|                 {
 | ||
|                     _ContainerVisualStyles = new ContainerVisualStyles();
 | ||
| 
 | ||
|                     StyleVisualChangeHandler(null, _ContainerVisualStyles);
 | ||
|                 }
 | ||
| 
 | ||
|                 return (_ContainerVisualStyles);
 | ||
|             }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_ContainerVisualStyles != value)
 | ||
|                 {
 | ||
|                     ContainerVisualStyles oldValue = _ContainerVisualStyles;
 | ||
| 
 | ||
|                     _ContainerVisualStyles = value;
 | ||
| 
 | ||
|                     OnStyleChanged("ContainerVisualStyles", oldValue, value);
 | ||
| 
 | ||
|                     if (oldValue != null)
 | ||
|                         oldValue.Dispose();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ContentBounds
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the Content area bounding rectangle.
 | ||
|         /// </summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public Rectangle ContentBounds
 | ||
|         {
 | ||
|             get { return (_ContentBounds); }
 | ||
|             internal set { _ContentBounds = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EffectiveContainerStyle
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets a reference to the container's effective (cached, composite) styles.
 | ||
|         /// </summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public EffectiveStyles<ContainerVisualStyle> EffectiveContainerStyles
 | ||
|         {
 | ||
|             get { return (_EffectiveContainerStyles); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EmptyText
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets the Text to display when the container is empty.
 | ||
|         /// </summary>
 | ||
|         [Browsable(true), Category("Appearance"), DefaultValue(null)]
 | ||
|         [Description("Indicates the Text to display when the container is empty.")]
 | ||
|         public string EmptyText
 | ||
|         {
 | ||
|             get { return (_EmptyText); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_EmptyText != value)
 | ||
|                 {
 | ||
|                     _EmptyText = value;
 | ||
| 
 | ||
|                     EmptyTextMarkupChanged();
 | ||
| 
 | ||
|                     OnPropertyChangedEx("EmptyText", VisualChangeType.Render);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EnableEmptyTextMarkup
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets whether EmptyText markup support is enabled.
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(false), Category("Appearance")]
 | ||
|         [Description("Indicates whether EmptyText markup support is enabled.")]
 | ||
|         public bool EnableEmptyTextMarkup
 | ||
|         {
 | ||
|             get { return (TestState(States.EnableEmptyTextMarkup)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (EnableEmptyTextMarkup != value)
 | ||
|                 {
 | ||
|                     SetState(States.EnableEmptyTextMarkup, value);
 | ||
| 
 | ||
|                     EmptyTextMarkupChanged();
 | ||
| 
 | ||
|                     OnPropertyChangedEx("EnableEmptyTextMarkup", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #region Markup support
 | ||
| 
 | ||
|         private void EmptyTextMarkupChanged()
 | ||
|         {
 | ||
|             _EmptyTextMarkup = null;
 | ||
| 
 | ||
|             if (EnableEmptyTextMarkup == true)
 | ||
|             {
 | ||
|                 if (MarkupParser.IsMarkup(_EmptyText) == true)
 | ||
|                 {
 | ||
|                     _EmptyTextMarkup = MarkupParser.Parse(_EmptyText);
 | ||
| 
 | ||
|                     if (_EmptyTextMarkup != null)
 | ||
|                         _EmptyTextMarkup.HyperLinkClick += EmptyTextMarkupLinkClick;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Occurs when a text markup link is clicked
 | ||
|         /// </summary>
 | ||
|         protected virtual void EmptyTextMarkupLinkClick(object sender, EventArgs e)
 | ||
|         {
 | ||
|             HyperLink link = sender as HyperLink;
 | ||
| 
 | ||
|             ChartControl.DoEmptyTextMarkupLinkClickEvent(this, link);
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets plain text without text-markup (if text-markup is used in EmptyText)
 | ||
|         /// </summary>
 | ||
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | ||
|         public string EmptyTextPlainText
 | ||
|         {
 | ||
|             get { return (_EmptyTextMarkup != null ? _EmptyTextMarkup.PlainText : _EmptyText); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EnablePanning
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets whether the container can be panned with the mouse.
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(true), Category("Behavior")]
 | ||
|         [Description("Indicates whether the container can be panned with the mouse.")]
 | ||
|         public bool EnablePanning
 | ||
|         {
 | ||
|             get { return (TestState(States.EnablePanning)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != EnablePanning)
 | ||
|                 {
 | ||
|                     SetState(States.EnablePanning, value);
 | ||
| 
 | ||
|                     OnPropertyChanged("EnablePanning");
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EnableSelection
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets whether the CONTAINER can be "selected" with the mouse.
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(false), Category("Behavior")]
 | ||
|         [Description("Indicates whether the CONTAINER can be \"selected\" with the mouse.")]
 | ||
|         public bool EnableSelection
 | ||
|         {
 | ||
|             get { return (TestState(States.EnableSelection)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != EnableSelection)
 | ||
|                 {
 | ||
|                     SetState(States.EnableSelection, value);
 | ||
| 
 | ||
|                     OnPropertyChanged("EnableSelection");
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region FillWeight
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets a value which, when AutoSizeMode is Fill,
 | ||
|         /// represents the width of the container relative to the widths
 | ||
|         /// of other fill-mode containers (default value is 100).
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(100), Category("Layout")]
 | ||
|         [Description("Indicates a value which, when AutoSizeMode is Fill, represents the width of the containers relative to the widths of other fill-mode containers (default value is 100).")]
 | ||
|         public int FillWeight
 | ||
|         {
 | ||
|             get { return (_FillWeight); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _FillWeight)
 | ||
|                 {
 | ||
|                     _FillWeight = value;
 | ||
| 
 | ||
|                     OnPropertyChangedEx("FillWeight", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region FrameBounds
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the Frame area bounding rectangle.
 | ||
|         /// </summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public Rectangle FrameBounds
 | ||
|         {
 | ||
|             get { return (_FrameBounds); }
 | ||
|             internal set { _FrameBounds = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region HScrollBar
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets a reference to the containers’s horizontal scrollbar
 | ||
|         ///</summary>
 | ||
|         [Category("ScrollBar")]
 | ||
|         [Description("Indicates the container’s horizontal scrollbar.")]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | ||
|         public ScrollBarLite HScrollBar
 | ||
|         {
 | ||
|             get { return (_HScrollBar); }
 | ||
|             internal set { _HScrollBar = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region HScrollBarHeight
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets the horizontal scrollBar height.
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(9), Category("ScrollBar")]
 | ||
|         [Description("Indicates the horizontal scrollBar height")]
 | ||
|         public int HScrollBarHeight
 | ||
|         {
 | ||
|             get { return (_HScrollBarHeight); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _HScrollBarHeight)
 | ||
|                 {
 | ||
|                     if (value > 0)
 | ||
|                     {
 | ||
|                         _HScrollBarHeight = value;
 | ||
| 
 | ||
|                         OnPropertyChangedEx("HScrollBarHeight", VisualChangeType.Layout);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region HScrollOffset
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets the horizontal scrollbar offset.
 | ||
|         ///</summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public int HScrollOffset
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 if (_HScrollBar != null && _HScrollBar.Visible == true)
 | ||
|                     return (_HScrollBar.Value);
 | ||
| 
 | ||
|                 return (0);
 | ||
|             }
 | ||
| 
 | ||
|             set { SetHScrollValue(value); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region HScrollBarVisible
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets whether Horizontal Scrollbar is shown if needed (due to content of the control exceeding available width).
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(true), Category("ScrollBar")]
 | ||
|         [Description("Indicates whether Horizontal Scrollbar is shown if needed (due to content of the control exceeding available width).")]
 | ||
|         public bool HScrollBarVisible
 | ||
|         {
 | ||
|             get { return (TestState(States.HScrollBarVisible)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != HScrollBarVisible)
 | ||
|                 {
 | ||
|                     SetState(States.HScrollBarVisible, value);
 | ||
| 
 | ||
|                     InvalidateLayout();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region IsSelected
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets whether the container is selected.
 | ||
|         ///</summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public bool IsSelected
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 ChartControl chartControl = ChartControl;
 | ||
| 
 | ||
|                 if (chartControl != null)
 | ||
|                 {
 | ||
|                     if (_SelectionUpdateCount == chartControl.SelectionUpdateCount)
 | ||
|                         return (TestState(States.IsSelected));
 | ||
| 
 | ||
|                     bool selected = chartControl.GetSelected(this);
 | ||
| 
 | ||
|                     SetState(States.IsSelected, selected);
 | ||
| 
 | ||
|                     _SelectionUpdateCount = chartControl.SelectionUpdateCount;
 | ||
|                 }
 | ||
| 
 | ||
|                 return (TestState(States.IsSelected));
 | ||
|             }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != IsSelected)
 | ||
|                 {
 | ||
|                     SetState(States.IsSelected, value);
 | ||
| 
 | ||
|                     ChartControl chartControl = ChartControl;
 | ||
| 
 | ||
|                     if (chartControl != null)
 | ||
|                     {
 | ||
|                         chartControl.SetSelected(this, value);
 | ||
| 
 | ||
|                         InvalidateRender();
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Legend
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or Sets the element Legend.
 | ||
|         /// </summary>
 | ||
|         [Category("Legend")]
 | ||
|         [Description("Indicates the element Legend.")]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | ||
|         public ChartLegend Legend
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 if (_Legend == null)
 | ||
|                     Legend = new ChartLegend();
 | ||
| 
 | ||
|                 return (_Legend);
 | ||
|             }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _Legend)
 | ||
|                 {
 | ||
|                     if (_Legend != null)
 | ||
|                     {
 | ||
|                         _Legend.Parent = null;
 | ||
|                         _Legend.PropertyChanged -= LegendPropertyChanged;
 | ||
|                     }
 | ||
| 
 | ||
|                     _Legend = value;
 | ||
| 
 | ||
|                     if (_Legend != null)
 | ||
|                     {
 | ||
|                         _Legend.Parent = this;
 | ||
|                         _Legend.PropertyChanged += LegendPropertyChanged;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         void LegendPropertyChanged(object sender, PropertyChangedEventArgs e)
 | ||
|         {
 | ||
|             InvalidateLayout();
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixAlignEndColumn
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets whether the container's content ending X-offset is aligned 
 | ||
|         /// with other containers ending in the same ChartMatrix column.
 | ||
|         ///</summary>
 | ||
|         [DefaultValue(false), Category("Matrix")]
 | ||
|         [Description("Indicates whether the container's content ending X-offset is aligned with other containers ending in the same ChartMatrix column.")]
 | ||
|         public bool MatrixAlignEndColumn
 | ||
|         {
 | ||
|             get { return (TestState(States.MatrixAlignEndColumn)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != MatrixAlignEndColumn)
 | ||
|                 {
 | ||
|                     SetState(States.MatrixAlignEndColumn, value);
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MatrixAlignEndColumn", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixAlignEndRow
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets whether the container's content ending Y-offset is aligned 
 | ||
|         /// with other containers ending in the same ChartMatrix row.
 | ||
|         ///</summary>
 | ||
|         [DefaultValue(false), Category("Matrix")]
 | ||
|         [Description("Indicates whether the container's content ending Y-offset is aligned with other containers ending in the same ChartMatrix row.")]
 | ||
|         public bool MatrixAlignEndRow
 | ||
|         {
 | ||
|             get { return (TestState(States.MatrixAlignEndRow)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != MatrixAlignEndRow)
 | ||
|                 {
 | ||
|                     SetState(States.MatrixAlignEndRow, value);
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MatrixAlignEndRow", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixAlignStartColumn
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets whether the container's content starting X-offset is aligned 
 | ||
|         /// with other containers starting in the same ChartMatrix column.
 | ||
|         ///</summary>
 | ||
|         [DefaultValue(false), Category("Matrix")]
 | ||
|         [Description("Indicates whether the container's content starting X-offset is aligned with other containers starting in the same ChartMatrix column.")]
 | ||
|         public bool MatrixAlignStartColumn
 | ||
|         {
 | ||
|             get { return (TestState(States.MatrixAlignStartColumn)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != MatrixAlignStartColumn)
 | ||
|                 {
 | ||
|                     SetState(States.MatrixAlignStartColumn, value);
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MatrixAlignStartColumn", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixAlignStartRow
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets whether the container's content starting Y-offset is aligned 
 | ||
|         /// with other containers starting in the same ChartMatrix row.
 | ||
|         ///</summary>
 | ||
|         [DefaultValue(false), Category("Matrix")]
 | ||
|         [Description("Indicates whether the container's content starting Y-offset is aligned with other containers starting in the same ChartMatrix row.")]
 | ||
|         public bool MatrixAlignStartRow
 | ||
|         {
 | ||
|             get { return (TestState(States.MatrixAlignStartRow)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != MatrixAlignStartRow)
 | ||
|                 {
 | ||
|                     SetState(States.MatrixAlignStartRow, value);
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MatrixAlignStartRow", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixDisplayBounds
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets the containers matrix display bounds (in relative units of the matrix).
 | ||
|         ///</summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public Rectangle MatrixDisplayBounds
 | ||
|         {
 | ||
|             get { return (_MatrixDisplayBounds); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _MatrixDisplayBounds)
 | ||
|                 {
 | ||
|                     _MatrixDisplayBounds = value;
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MatrixDisplayBounds", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixDisplayOrder
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets or sets the containers display order in the parent matrix layout
 | ||
|         /// (higher values are placed on top of lower values).
 | ||
|         ///</summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public int MatrixDisplayOrder
 | ||
|         {
 | ||
|             get { return (_MatrixDisplayOrder); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _MatrixDisplayOrder)
 | ||
|                 {
 | ||
|                     _MatrixDisplayOrder = value;
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MatrixDisplayOrder", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MinContentSize
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets the minimum size of the content area of the chart.
 | ||
|         /// </summary>
 | ||
|         [Category("Layout")]
 | ||
|         [Description("Indicates the minimum size of the content area of the chart.")]
 | ||
|         public Size MinContentSize
 | ||
|         {
 | ||
|             get { return (_MinContentSize); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _MinContentSize)
 | ||
|                 {
 | ||
|                     _MinContentSize = value;
 | ||
| 
 | ||
|                     OnPropertyChangedEx("MinContentSize", VisualChangeType.Layout);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | ||
|         internal virtual bool ShouldSerializeMinContentSize()
 | ||
|         {
 | ||
|             return (_MinContentSize.Width != 100 || _MinContentSize.Height != 100);
 | ||
|         }
 | ||
| 
 | ||
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | ||
|         internal virtual void ResetMinContentSize()
 | ||
|         {
 | ||
|             MinContentSize = new Size(100, 100);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ScrollBounds
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the Scrollable bounds.
 | ||
|         /// </summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public virtual Rectangle ScrollBounds
 | ||
|         {
 | ||
|             get { return (_ContentBounds); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ScrollBoundsEx
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the extended Scrollable bounds.
 | ||
|         /// </summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public virtual Rectangle ScrollBoundsEx
 | ||
|         {
 | ||
|             get { return (_ContentBoundsEx); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ScrollBoundsOffset
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets the current scrollbar offset
 | ||
|         ///</summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public Point ScrollBoundsOffset
 | ||
|         {
 | ||
|             get { return (new Point(HScrollOffset, VScrollOffset)); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Titles
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or Sets a reference to the collection of Titles
 | ||
|         /// </summary>
 | ||
|         [Category("Appearance")]
 | ||
|         [Description("Indicates the collection of Titles.")]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | ||
|         public ChartTitleCollection Titles
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 if (_Titles == null)
 | ||
|                 {
 | ||
|                     _Titles = new ChartTitleCollection();
 | ||
| 
 | ||
|                     _Titles.CollectionChanged += TitlesCollectionChanged;
 | ||
|                 }
 | ||
| 
 | ||
|                 return (_Titles);
 | ||
|             }
 | ||
| 
 | ||
|             internal set
 | ||
|             {
 | ||
|                 if (_Titles != null)
 | ||
|                     _Titles.CollectionChanged -= TitlesCollectionChanged;
 | ||
| 
 | ||
|                 _Titles = value;
 | ||
| 
 | ||
|                 if (_Titles != null)
 | ||
|                     _Titles.CollectionChanged += TitlesCollectionChanged;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #region TitlesCollectionChanged
 | ||
| 
 | ||
|         void TitlesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 | ||
|         {
 | ||
|             switch (e.Action)
 | ||
|             {
 | ||
|                 case NotifyCollectionChangedAction.Add:
 | ||
|                     foreach (ChartTitle title in e.NewItems)
 | ||
|                         title.Parent = this;
 | ||
|                     break;
 | ||
| 
 | ||
|                 case NotifyCollectionChangedAction.Replace:
 | ||
|                     foreach (ChartTitle title in e.OldItems)
 | ||
|                         title.Parent = null;
 | ||
| 
 | ||
|                     foreach (ChartTitle title in e.NewItems)
 | ||
|                         title.Parent = this;
 | ||
|                     break;
 | ||
| 
 | ||
|                 case NotifyCollectionChangedAction.Remove:
 | ||
|                     foreach (ChartTitle title in e.OldItems)
 | ||
|                         title.Parent = null;
 | ||
|                     break;
 | ||
|             }
 | ||
| 
 | ||
|             InvalidateLayout();
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region VScrollBar
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets a reference to the container’s vertical scrollbar
 | ||
|         ///</summary>
 | ||
|         [Category("ScrollBar")]
 | ||
|         [Description("Indicates the container’s vertical scrollbar.")]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | ||
|         public ScrollBarLite VScrollBar
 | ||
|         {
 | ||
|             get { return (_VScrollBar); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region VScrollBarWidth
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets the vertical scrollBar width.
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(9), Category("ScrollBar")]
 | ||
|         [Description("Indicates the vertical scrollBar width")]
 | ||
|         public int VScrollBarWidth
 | ||
|         {
 | ||
|             get { return (_VScrollBarWidth); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != _VScrollBarWidth)
 | ||
|                 {
 | ||
|                     if (value > 0)
 | ||
|                     {
 | ||
|                         _VScrollBarWidth = value;
 | ||
| 
 | ||
|                         OnPropertyChangedEx("VScrollBarWidth", VisualChangeType.Layout);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region VScrollOffset
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         /// Gets the vertical scrollbar offset
 | ||
|         ///</summary>
 | ||
|         [Browsable(false)]
 | ||
|         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | ||
|         public int VScrollOffset
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 if (_VScrollBar != null && _VScrollBar.Visible == true)
 | ||
|                     return (_VScrollBar.Value);
 | ||
| 
 | ||
|                 return (0);
 | ||
|             }
 | ||
| 
 | ||
|             set { SetVScrollValue(value); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region VScrollBarVisible
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets or sets whether Vertical Scrollbar is shown when needed (due to the content area exceeding available height).
 | ||
|         /// </summary>
 | ||
|         [DefaultValue(true), Category("ScrollBar")]
 | ||
|         [Description("Indicates whether Vertical Scrollbar is shown when needed (due to the content area exceeding available height)")]
 | ||
|         public bool VScrollBarVisible
 | ||
|         {
 | ||
|             get { return (TestState(States.VScrollBarVisible)); }
 | ||
| 
 | ||
|             set
 | ||
|             {
 | ||
|                 if (value != VScrollBarVisible)
 | ||
|                 {
 | ||
|                     SetState(States.VScrollBarVisible, value);
 | ||
| 
 | ||
|                     InvalidateLayout();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Internal properties
 | ||
| 
 | ||
|         #region ContentBoundsEx
 | ||
| 
 | ||
|         internal Rectangle ContentBoundsEx
 | ||
|         {
 | ||
|             get { return (_ContentBoundsEx); }
 | ||
|             set { _ContentBoundsEx = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EmptyTextMarkup
 | ||
| 
 | ||
|         internal BodyElement EmptyTextMarkup
 | ||
|         {
 | ||
|             get { return (_EmptyTextMarkup); }
 | ||
|             set { _EmptyTextMarkup = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region HitArea
 | ||
| 
 | ||
|         internal ItemHitArea HitArea
 | ||
|         {
 | ||
|             get { return (_HitArea); }
 | ||
|             set { _HitArea = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region IsSubPanel
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets whether the ChartPanel is a subordinate / nested panel.
 | ||
|         /// </summary>
 | ||
|         internal bool IsSubPanel
 | ||
|         {
 | ||
|             get { return (Parent != null); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixColumnAligned
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets whether the ChartContainer column was MatrixAligned.
 | ||
|         /// </summary>
 | ||
|         internal bool MatrixColumnAligned
 | ||
|         {
 | ||
|             get { return (TestState(States.MatrixColumnAligned)); }
 | ||
|             set { SetState(States.MatrixColumnAligned, value); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MatrixRowAligned
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets whether the ChartContainer row was MatrixAligned.
 | ||
|         /// </summary>
 | ||
|         internal bool MatrixRowAligned
 | ||
|         {
 | ||
|             get { return (TestState(States.MatrixRowAligned)); }
 | ||
|             set { SetState(States.MatrixRowAligned, value); }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MouseDownHitArea
 | ||
| 
 | ||
|         internal ItemHitArea MouseDownHitArea
 | ||
|         {
 | ||
|             get { return (_MouseDownHitArea); }
 | ||
|             set { _MouseDownHitArea = value; }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region MeasureOverride
 | ||
| 
 | ||
|         protected override void MeasureOverride(ChartLayoutInfo layoutInfo)
 | ||
|         {
 | ||
|             if (Legend.Visible == true)
 | ||
|                 Legend.Measure(layoutInfo);
 | ||
| 
 | ||
|             foreach (ChartTitle title in Titles)
 | ||
|             {
 | ||
|                 if (title.Visible == true)
 | ||
|                     title.Measure(layoutInfo);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ArrangeOverride
 | ||
| 
 | ||
|         protected override void ArrangeOverride(ChartLayoutInfo layoutInfo)
 | ||
|         {
 | ||
|             if (Legend.Visible == true)
 | ||
|                 Legend.Arrange(layoutInfo);
 | ||
| 
 | ||
|             foreach (ChartTitle title in Titles)
 | ||
|             {
 | ||
|                 if (title.Visible == true)
 | ||
|                     title.Arrange(layoutInfo);
 | ||
|             }
 | ||
| 
 | ||
|             UpdateScrollBars(layoutInfo);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region RenderOverride
 | ||
| 
 | ||
|         protected override void RenderOverride(ChartRenderInfo renderInfo)
 | ||
|         {
 | ||
|             Graphics g = renderInfo.Graphics;
 | ||
| 
 | ||
|             // Render Titles
 | ||
| 
 | ||
|             foreach (ChartTitle title in Titles)
 | ||
|             {
 | ||
|                 if (title.Visible == true)
 | ||
|                     title.Render(renderInfo);
 | ||
|             }
 | ||
| 
 | ||
|             // Render the Legend
 | ||
| 
 | ||
|             if (Legend.Visible == true)
 | ||
|                 Legend.Render(renderInfo);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region RenderTextMarkup
 | ||
| 
 | ||
|         internal void RenderTextMarkup(Graphics g,
 | ||
|             Font font, Color textColor, Alignment alignment, Rectangle r)
 | ||
|         {
 | ||
|             if (textColor.IsEmpty)
 | ||
|                 textColor = Color.Black;
 | ||
| 
 | ||
|             MarkupDrawContext d =
 | ||
|                 new MarkupDrawContext(g, font, textColor, false);
 | ||
| 
 | ||
|             _EmptyTextMarkup.Arrange(new Rectangle(Point.Empty, r.Size), d);
 | ||
| 
 | ||
|             Size size = _EmptyTextMarkup.Bounds.Size;
 | ||
| 
 | ||
|             switch (alignment)
 | ||
|             {
 | ||
|                 case Alignment.NotSet:
 | ||
|                 case Alignment.MiddleLeft:
 | ||
|                 case Alignment.MiddleCenter:
 | ||
|                 case Alignment.MiddleRight:
 | ||
|                     if (r.Height > size.Height)
 | ||
|                         r.Y += (r.Height - size.Height) / 2;
 | ||
|                     break;
 | ||
| 
 | ||
|                 case Alignment.BottomLeft:
 | ||
|                 case Alignment.BottomCenter:
 | ||
|                 case Alignment.BottomRight:
 | ||
|                     if (r.Height > size.Height)
 | ||
|                         r.Y = r.Bottom - size.Height;
 | ||
|                     break;
 | ||
|             }
 | ||
| 
 | ||
|             _EmptyTextMarkup.Bounds = new Rectangle(r.Location, size);
 | ||
| 
 | ||
|             Region oldClip = g.Clip;
 | ||
| 
 | ||
|             try
 | ||
|             {
 | ||
|                 g.SetClip(r, CombineMode.Intersect);
 | ||
| 
 | ||
|                 _EmptyTextMarkup.Render(d);
 | ||
|             }
 | ||
|             finally
 | ||
|             {
 | ||
|                 g.Clip = oldClip;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region RenderEmptyText
 | ||
| 
 | ||
|         protected void RenderEmptyText(
 | ||
|             Graphics g, ContainerVisualStyle style, Rectangle bounds)
 | ||
|         {
 | ||
|             if (String.IsNullOrEmpty(EmptyText) == false)
 | ||
|             {
 | ||
|                 if (EmptyTextMarkup != null)
 | ||
|                 {
 | ||
|                     RenderTextMarkup(g, style.Font,
 | ||
|                         style.TextColor, style.Alignment, bounds);
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     eTextFormat tf = style.GetTextFormatFlags();
 | ||
| 
 | ||
|                     TextDrawing.DrawString(g,
 | ||
|                         EmptyText, style.Font, style.TextColor, bounds, tf);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region RenderScrollbars
 | ||
| 
 | ||
|         protected void RenderScrollbars(ChartRenderInfo renderInfo)
 | ||
|         {
 | ||
|             Graphics g = renderInfo.Graphics;
 | ||
| 
 | ||
|             if (HScrollBar.Visible == true && VScrollBar.Visible == true)
 | ||
|             {
 | ||
|                 ScrollBarVisualStyle style = VScrollBar.GetEffectiveStyle();
 | ||
| 
 | ||
|                 Rectangle r = HScrollBar.Bounds;
 | ||
| 
 | ||
|                 r.X = VScrollBar.Bounds.X;
 | ||
|                 r.Width = VScrollBar.Width;
 | ||
| 
 | ||
|                 using (Brush br = style.TrackBackground.GetBrush(r))
 | ||
|                     g.FillRectangle(br, r);
 | ||
| 
 | ||
|                 using (Pen pen = new Pen(style.BorderColor))
 | ||
|                     g.DrawRectangle(pen, r);
 | ||
|             }
 | ||
| 
 | ||
|             if (HScrollBar.Visible == true)
 | ||
|                 HScrollBar.Render(renderInfo);
 | ||
| 
 | ||
|             if (VScrollBar.Visible == true)
 | ||
|                 VScrollBar.Render(renderInfo);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Mouse handling
 | ||
| 
 | ||
|         #region OnMouseEnter
 | ||
| 
 | ||
|         protected override bool OnMouseEnter(EventArgs e)
 | ||
|         {
 | ||
|             base.OnMouseEnter(e);
 | ||
| 
 | ||
|             InvalidateRender();
 | ||
| 
 | ||
|             return (true);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region OnMouseLeave
 | ||
| 
 | ||
|         protected override bool OnMouseLeave(EventArgs e)
 | ||
|         {
 | ||
|             base.OnMouseLeave(e);
 | ||
| 
 | ||
|             InvalidateRender();
 | ||
| 
 | ||
|             return (true);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region OnMouseMove
 | ||
| 
 | ||
|         protected override bool OnMouseMove(MouseEventArgs e)
 | ||
|         {
 | ||
|             _HitArea = GetHitArea(e.Location);
 | ||
| 
 | ||
|             if (IsMouseDown == true)
 | ||
|                 return (OnMouseDownMove(e));
 | ||
| 
 | ||
|             if (_HitArea == ItemHitArea.InContent)
 | ||
|             {
 | ||
|                 if (EmptyTextMarkup != null)
 | ||
|                 {
 | ||
|                     ChartControl.SetChartCursor = true;
 | ||
|                     EmptyTextMarkup.MouseMove(ChartControl, e);
 | ||
|                     ChartControl.SetChartCursor = false;
 | ||
| 
 | ||
|                     if (EmptyTextMarkup.MouseOverElement != null)
 | ||
|                     {
 | ||
|                         if (EmptyTextMarkup.MouseOverElement is HyperLink)
 | ||
|                             return (true);
 | ||
|                     }
 | ||
|                 }
 | ||
| 
 | ||
|                 if (EnablePanning == true &&
 | ||
|                     (HScrollBar.Enabled == true || VScrollBar.Enabled == true))
 | ||
|                 {
 | ||
|                     ChartCursor = OpenHandCursor;
 | ||
| 
 | ||
|                     return (true);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             ChartCursor = Cursors.Default;
 | ||
| 
 | ||
|             return (false);
 | ||
|         }
 | ||
| 
 | ||
|         #region OnMouseDownMove
 | ||
| 
 | ||
|         private bool OnMouseDownMove(MouseEventArgs e)
 | ||
|         {
 | ||
|             if (_Panning == true)
 | ||
|             {
 | ||
|                 ChartCursor = ClosedHandCursor;
 | ||
| 
 | ||
|                 if (HScrollBar.Enabled == true)
 | ||
|                     HScrollOffset = _HPanOffset + (MouseDownPoint.X - e.Location.X);
 | ||
| 
 | ||
|                 if (VScrollBar.Enabled == true)
 | ||
|                 {
 | ||
|                     int n = (MouseDownPoint.Y - e.Location.Y);
 | ||
| 
 | ||
|                     if (VScrollBar.Inverted == true)
 | ||
|                         VScrollOffset = _VPanOffset - n;
 | ||
|                     else
 | ||
|                         VScrollOffset = _VPanOffset + n;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             return (true);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region OnMouseDown
 | ||
| 
 | ||
|         protected override bool OnMouseDown(MouseEventArgs e)
 | ||
|         {
 | ||
|             ChartControl.Focus();
 | ||
| 
 | ||
|             UpdateSelection(e);
 | ||
| 
 | ||
|             return (OnMouseDownEx(e));
 | ||
|         }
 | ||
| 
 | ||
|         protected override bool OnMouseDownEx(MouseEventArgs e)
 | ||
|         {
 | ||
|             base.OnMouseDown(e);
 | ||
| 
 | ||
|             MouseDownHitArea = _HitArea;
 | ||
| 
 | ||
|             if (EmptyTextMarkup != null)
 | ||
|             {
 | ||
|                 if (EmptyTextMarkup.MouseOverElement != null)
 | ||
|                 {
 | ||
|                     EmptyTextMarkup.MouseDown(ChartControl, e);
 | ||
| 
 | ||
|                     return (true);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if (_HitArea == ItemHitArea.InContent)
 | ||
|             {
 | ||
|                 if (EnablePanning == true &&
 | ||
|                     (HScrollBar.Visible == true || VScrollBar.Visible == true))
 | ||
|                 {
 | ||
|                     _HPanOffset = HScrollOffset;
 | ||
|                     _VPanOffset = VScrollOffset;
 | ||
| 
 | ||
|                     _Panning = true;
 | ||
| 
 | ||
|                     ChartCursor = ClosedHandCursor;
 | ||
|                     ChartControl.PostInternalMouseMove();
 | ||
| 
 | ||
|                     ChartControl.CapturedItem = this;
 | ||
| 
 | ||
|                     return (true);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             return (false);
 | ||
|         }
 | ||
| 
 | ||
|         #region UpdateSelection
 | ||
| 
 | ||
|         private void UpdateSelection(MouseEventArgs e)
 | ||
|         {
 | ||
|             ChartContainer parent = Parent as ChartContainer;
 | ||
| 
 | ||
|             if (parent != null && parent.EnableSelection == true)
 | ||
|             {
 | ||
|                 if (IsSelected == false ||
 | ||
|                     ((e.Button & MouseButtons.Left) == MouseButtons.Left))
 | ||
|                 {
 | ||
|                     ChartControl chartControl = ChartControl;
 | ||
| 
 | ||
|                     if (chartControl != null)
 | ||
|                     {
 | ||
|                         bool ctrlKey = ((Control.ModifierKeys & Keys.Control) == Keys.Control);
 | ||
| 
 | ||
|                         if (ctrlKey == true)
 | ||
|                         {
 | ||
|                             chartControl.SetSelected(this, !IsSelected);
 | ||
|                         }
 | ||
|                         else
 | ||
|                         {
 | ||
|                             chartControl.ClearAllSelected();
 | ||
| 
 | ||
|                             chartControl.SetSelected(this, true);
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region OnMouseUp
 | ||
| 
 | ||
|         protected override bool OnMouseUp(MouseEventArgs e)
 | ||
|         {
 | ||
|             base.OnMouseUp(e);
 | ||
| 
 | ||
|             if (EmptyTextMarkup != null)
 | ||
|             {
 | ||
|                 if (EmptyTextMarkup.MouseOverElement != null)
 | ||
|                     EmptyTextMarkup.Click(ChartControl);
 | ||
|             }
 | ||
| 
 | ||
|             if (_Panning == true)
 | ||
|             {
 | ||
|                 _Panning = false;
 | ||
| 
 | ||
|                 ChartControl.CapturedItem = null;
 | ||
|             }
 | ||
| 
 | ||
|             return (true);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region OnMouseWheel
 | ||
| 
 | ||
|         protected override bool OnMouseWheel(MouseEventArgs e)
 | ||
|         {
 | ||
|             if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
 | ||
|                 return (OnHorizontalMouseWheel(e));
 | ||
| 
 | ||
|             return (OnVerticalMouseWheel(e));
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         #region OnHorizontalMouseWheel
 | ||
| 
 | ||
|         private bool OnHorizontalMouseWheel(MouseEventArgs e)
 | ||
|         {
 | ||
|             if (HScrollBar.Enabled == true)
 | ||
|             {
 | ||
|                 if ((e.Delta < 0 && HScrollBar.IsAtMaxumum == false) ||
 | ||
|                     (e.Delta > 0 && HScrollBar.IsAtMinumum == false))
 | ||
|                 {
 | ||
|                     SetHWheelValue(-e.Delta);
 | ||
| 
 | ||
|                     return (true);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             return (false);
 | ||
|         }
 | ||
| 
 | ||
|         #region SetHWheelValue
 | ||
| 
 | ||
|         private void SetHWheelValue(int delta)
 | ||
|         {
 | ||
|             int value = delta * SystemInformation.MouseWheelScrollLines / 120;
 | ||
| 
 | ||
|             value *= HScrollBar.SmallChange;
 | ||
|             value += HScrollBar.Value;
 | ||
| 
 | ||
|             SetHScrollValue(value);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region OnVerticalMouseWheel
 | ||
| 
 | ||
|         private bool OnVerticalMouseWheel(MouseEventArgs e)
 | ||
|         {
 | ||
|             if (VScrollBar.Enabled == true)
 | ||
|             {
 | ||
|                 if (VScrollBar.Inverted == true)
 | ||
|                 {
 | ||
|                     if ((e.Delta < 0 && VScrollBar.IsAtMinumum == false) ||
 | ||
|                         (e.Delta > 0 && VScrollBar.IsAtMaxumum == false))
 | ||
|                     {
 | ||
|                         SetVWheelValue(e.Delta);
 | ||
| 
 | ||
|                         return (true);
 | ||
|                     }
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     if ((e.Delta < 0 && VScrollBar.IsAtMaxumum == false) ||
 | ||
|                         (e.Delta > 0 && VScrollBar.IsAtMinumum == false))
 | ||
|                     {
 | ||
|                         SetVWheelValue(-e.Delta);
 | ||
| 
 | ||
|                         return (true);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             return (false);
 | ||
|         }
 | ||
| 
 | ||
|         #region SetVWheelValue
 | ||
| 
 | ||
|         private void SetVWheelValue(int delta)
 | ||
|         {
 | ||
|             int value = delta * SystemInformation.MouseWheelScrollLines / 120;
 | ||
| 
 | ||
|             value *= VScrollBar.SmallChange;
 | ||
|             value += VScrollBar.Value;
 | ||
| 
 | ||
|             SetVScrollValue(value);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Scrollbar support
 | ||
| 
 | ||
|         #region SetupScrollBars
 | ||
| 
 | ||
|         private void SetupScrollBars()
 | ||
|         {
 | ||
|             _VScrollBar = new VScrollBarLite();
 | ||
|             _VScrollBar.Parent = this;
 | ||
|             _VScrollBar.Width = Dpi.Width(VScrollBarWidth);
 | ||
| 
 | ||
|             _HScrollBar = new HScrollBarLite();
 | ||
|             _HScrollBar.Parent = this;
 | ||
|             _HScrollBar.Height = Dpi.Height(HScrollBarHeight);
 | ||
| 
 | ||
|             _HScrollBar.Visible = false;
 | ||
|             _VScrollBar.Visible = false;
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region UpdateScrollBars
 | ||
| 
 | ||
|         private void UpdateScrollBars(ChartLayoutInfo layoutInfo)
 | ||
|         {
 | ||
|             Rectangle cbounds = ScrollBounds;
 | ||
|             Rectangle cboundsEx = ScrollBoundsEx;
 | ||
| 
 | ||
|             EnableHScrollBar(cbounds, cboundsEx);
 | ||
|             EnableVScrollBar(cbounds, cboundsEx);
 | ||
| 
 | ||
|             if (_HScrollBar.Enabled == true)
 | ||
|             {
 | ||
|                 int widthEx = cboundsEx.Width;
 | ||
| 
 | ||
|                 _HScrollBar.SmallChange = cbounds.Width / 20;
 | ||
|                 _HScrollBar.Maximum = Math.Max(0, widthEx);
 | ||
|                 _HScrollBar.LargeChange = Math.Min(cbounds.Width, _HScrollBar.Maximum);
 | ||
| 
 | ||
|                 if (_HScrollBar.Value + _HScrollBar.LargeChange > _HScrollBar.Maximum)
 | ||
|                     _HScrollBar.Value = _HScrollBar.Maximum - _HScrollBar.LargeChange;
 | ||
| 
 | ||
|                 _HScrollBar.Arrange(layoutInfo);
 | ||
|             }
 | ||
| 
 | ||
|             if (_VScrollBar.Enabled == true)
 | ||
|             {
 | ||
|                 int heightEx = cboundsEx.Height;
 | ||
| 
 | ||
|                 _VScrollBar.SmallChange = cbounds.Height / 20;
 | ||
|                 _VScrollBar.Maximum = Math.Max(0, heightEx);
 | ||
|                 _VScrollBar.LargeChange = Math.Min(cbounds.Height, _VScrollBar.Maximum);
 | ||
| 
 | ||
|                 if (_VScrollBar.Value + _VScrollBar.LargeChange > _VScrollBar.Maximum)
 | ||
|                     _VScrollBar.Value = _VScrollBar.Maximum - _VScrollBar.LargeChange;
 | ||
| 
 | ||
|                 _VScrollBar.Arrange(layoutInfo);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #region EnableHScrollBar
 | ||
| 
 | ||
|         private void EnableHScrollBar(Rectangle cbounds, Rectangle cboundsEx)
 | ||
|         {
 | ||
|             bool enable = (HScrollBarVisible == true) &&
 | ||
|                 (cboundsEx.Width > cbounds.Width);
 | ||
| 
 | ||
|             if ((cbounds.Height < _HScrollBar.Height + 4) || cbounds.Width <= 0)
 | ||
|                 enable = false;
 | ||
| 
 | ||
|             if (enable == true)
 | ||
|             {
 | ||
|                 _HScrollBar.Location = new
 | ||
|                     Point(cbounds.Left, cbounds.Bottom - _HScrollBar.Height - 1);
 | ||
| 
 | ||
|                 int n = cbounds.Width - 1;
 | ||
| 
 | ||
|                 if (_VScrollBar.Visible == true)
 | ||
|                     n -= _VScrollBar.Width;
 | ||
| 
 | ||
|                 _HScrollBar.Width = n;
 | ||
|                 _HScrollBar.Height = Dpi.Height(HScrollBarHeight);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 _HScrollBar.Value = 0;
 | ||
|             }
 | ||
| 
 | ||
|             _HScrollBar.Enabled = enable;
 | ||
|             _HScrollBar.Visible = enable;
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EnableVScrollBar
 | ||
| 
 | ||
|         private void EnableVScrollBar(Rectangle cbounds, Rectangle cboundsEx)
 | ||
|         {
 | ||
|             bool enable = (VScrollBarVisible == true) &&
 | ||
|                 (cboundsEx.Height > cbounds.Height);
 | ||
| 
 | ||
|             if (cbounds.Height <= 0 || (cbounds.Width < _VScrollBar.Width + 4))
 | ||
|                 enable = false;
 | ||
| 
 | ||
|             if (enable == true)
 | ||
|             {
 | ||
|                 _VScrollBar.Location = new
 | ||
|                     Point(cbounds.Right - _VScrollBar.Width - 1, cbounds.Top);
 | ||
| 
 | ||
|                 _VScrollBar.Height = cbounds.Height - 1;
 | ||
| 
 | ||
|                 if (_HScrollBar.Visible == true)
 | ||
|                     _VScrollBar.Height -= _HScrollBar.Height;
 | ||
| 
 | ||
|                 _VScrollBar.Width = Dpi.Width(VScrollBarWidth);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 _VScrollBar.Value = 0;
 | ||
|             }
 | ||
| 
 | ||
|             _VScrollBar.Enabled = enable;
 | ||
|             _VScrollBar.Visible = enable;
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region SetVScrollValue
 | ||
| 
 | ||
|         internal void SetVScrollValue(int value)
 | ||
|         {
 | ||
|             if (_VScrollBar.Visible == true)
 | ||
|             {
 | ||
|                 int oldValue = _VScrollBar.Value;
 | ||
| 
 | ||
|                 value = Math.Max(value, 0);
 | ||
|                 value = Math.Min(value, _VScrollBar.Maximum);
 | ||
| 
 | ||
|                 _VScrollBar.Value = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region SetHScrollValue
 | ||
| 
 | ||
|         internal void SetHScrollValue(int value)
 | ||
|         {
 | ||
|             if (_HScrollBar.Visible == true)
 | ||
|             {
 | ||
|                 int oldValue = _HScrollBar.Value;
 | ||
| 
 | ||
|                 value = Math.Max(value, 0);
 | ||
|                 value = Math.Min(value, _HScrollBar.Maximum);
 | ||
| 
 | ||
|                 _HScrollBar.Value = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region AutoScrolling support
 | ||
| 
 | ||
|         #region EnableAutoScrolling
 | ||
| 
 | ||
|         internal void EnableAutoScrolling(
 | ||
|             AutoScrollEnable enable, Rectangle scrollRect)
 | ||
|         {
 | ||
|             if (ChartControl.Focused == true)
 | ||
|             {
 | ||
|                 _AutoScrollEnable = enable;
 | ||
| 
 | ||
|                 if ((_HScrollBar != null && _HScrollBar.Visible == true) ||
 | ||
|                     (_VScrollBar != null && _VScrollBar.Visible == true))
 | ||
|                 {
 | ||
|                     _ScrollRect = scrollRect;
 | ||
| 
 | ||
|                     if (_AutoScrollTimer == null)
 | ||
|                     {
 | ||
|                         _AutoScrollTimer = new Timer();
 | ||
| 
 | ||
|                         _AutoScrollTimer.Interval = 10;
 | ||
|                         _AutoScrollTimer.Tick += AutoScrollTimerTick;
 | ||
|                         _AutoScrollTimer.Start();
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region DisableAutoScrolling
 | ||
| 
 | ||
|         internal void DisableAutoScrolling()
 | ||
|         {
 | ||
|             if (_AutoScrollTimer != null)
 | ||
|             {
 | ||
|                 _AutoScrollTimer.Stop();
 | ||
|                 _AutoScrollTimer.Tick -= AutoScrollTimerTick;
 | ||
| 
 | ||
|                 _AutoScrollTimer = null;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region AutoScrollTimerTick
 | ||
| 
 | ||
|         private void AutoScrollTimerTick(object sender, EventArgs e)
 | ||
|         {
 | ||
|             Point pt = ChartControl.PointToClient(Cursor.Position);
 | ||
|             Rectangle t = _ScrollRect;
 | ||
| 
 | ||
|             if ((_AutoScrollEnable & AutoScrollEnable.Horizontal) == AutoScrollEnable.Horizontal &&
 | ||
|                 (_HScrollBar != null && _HScrollBar.Visible == true))
 | ||
|             {
 | ||
|                 int dx = (pt.X < t.X)
 | ||
|                     ? ScrollAmount(pt.X - t.X)
 | ||
|                     : (pt.X >= t.Right) ? ScrollAmount(pt.X - t.Right) : 0;
 | ||
| 
 | ||
|                 SetHScrollValue(_HScrollBar.Value + dx);
 | ||
|             }
 | ||
| 
 | ||
|             if ((_AutoScrollEnable & AutoScrollEnable.Vertical) == AutoScrollEnable.Vertical &&
 | ||
|                 (_VScrollBar != null && _VScrollBar.Visible == true))
 | ||
|             {
 | ||
|                 int dy = (pt.Y < t.Top)
 | ||
|                     ? ScrollAmount(pt.Y - t.Top)
 | ||
|                     : (pt.Y >= t.Bottom) ? ScrollAmount(pt.Y - t.Bottom) : 0;
 | ||
| 
 | ||
|                 SetVScrollValue(_VScrollBar.Value + dy);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ScrollAmount
 | ||
| 
 | ||
|         private int ScrollAmount(int delta)
 | ||
|         {
 | ||
|             int n = Math.Abs(delta);
 | ||
|             int amt = 1 << ((n / 16) + 1);
 | ||
| 
 | ||
|             return (delta < 0 ? -amt : amt);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region EnsureVisible
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Ensures the container is visible on screen, and optionally
 | ||
|         /// centered (if possible).
 | ||
|         /// </summary>
 | ||
|         /// <param name="center"></param>
 | ||
|         public virtual void EnsureVisible(bool center)
 | ||
|         {
 | ||
|             ChartContainer parent = Parent as ChartContainer;
 | ||
| 
 | ||
|             if (parent != null)
 | ||
|                 parent.EnsureVisible(this, center);
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Ensures that the given container "item" is visible
 | ||
|         /// on screen, and optionally centered (if possible).
 | ||
|         /// </summary>
 | ||
|         /// <param name="center"></param>
 | ||
|         public virtual void EnsureVisible(ChartContainer item, bool center)
 | ||
|         {
 | ||
|             Rectangle bounds = ContentBounds;
 | ||
| 
 | ||
|             bounds.X += HScrollOffset;
 | ||
| 
 | ||
|             if (VScrollBar.Inverted == true)
 | ||
|                 bounds.Y -= VScrollOffset;
 | ||
|             else
 | ||
|                 bounds.Y += VScrollOffset;
 | ||
| 
 | ||
|             if (HScrollBar.Enabled == true)
 | ||
|                 bounds.Width -= VScrollBar.Width;
 | ||
| 
 | ||
|             if (VScrollBar.Enabled == true)
 | ||
|                 bounds.Height -= HScrollBar.Height;
 | ||
| 
 | ||
|             bounds.Width -= Dpi.Width4;
 | ||
|             bounds.Height -= Dpi.Height4;
 | ||
| 
 | ||
|             Rectangle ibounds = item.FrameBounds;
 | ||
| 
 | ||
|             if (bounds.Contains(ibounds) == false)
 | ||
|             {
 | ||
|                 if (HScrollBar.Enabled == true)
 | ||
|                 {
 | ||
|                     if (center == true)
 | ||
|                     {
 | ||
|                         int x = (bounds.X + bounds.Right) / 2 - (ibounds.Width / 2);
 | ||
| 
 | ||
|                         SetHScrollValue(ibounds.X - x);
 | ||
|                     }
 | ||
|                     else
 | ||
|                     {
 | ||
|                         int x = ibounds.X;
 | ||
| 
 | ||
|                         if (ibounds.Right > bounds.Right)
 | ||
|                             x -= (ibounds.Right - bounds.Right);
 | ||
| 
 | ||
|                         if (x < bounds.X)
 | ||
|                             x = bounds.X;
 | ||
| 
 | ||
|                         SetHScrollValue(HScrollOffset + (ibounds.X - x));
 | ||
|                     }
 | ||
|                 }
 | ||
| 
 | ||
|                 if (VScrollBar.Enabled == true)
 | ||
|                 {
 | ||
|                     if (center == true)
 | ||
|                     {
 | ||
|                         int y = (bounds.Y + bounds.Bottom) / 2;
 | ||
|                         y -= (ibounds.Height / 2);
 | ||
| 
 | ||
|                         SetVScrollValue(ibounds.Y - y);
 | ||
|                     }
 | ||
|                     else
 | ||
|                     {
 | ||
|                         int y = ibounds.Y;
 | ||
| 
 | ||
|                         if (ibounds.Bottom > bounds.Bottom)
 | ||
|                             y -= (ibounds.Bottom - bounds.Bottom);
 | ||
| 
 | ||
|                         if (y < bounds.Y)
 | ||
|                             y = bounds.Y;
 | ||
| 
 | ||
|                         SetVScrollValue(VScrollOffset + (ibounds.Y - y));
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             ChartContainer parent = Parent as ChartContainer;
 | ||
| 
 | ||
|             if (parent != null)
 | ||
|                 parent.EnsureVisible(this, center);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region GetDisplayBounds
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the "displayBounds" of the given rectangle (scroll
 | ||
|         /// adjusted bounds).
 | ||
|         /// </summary>
 | ||
|         /// <param name="bounds"></param>
 | ||
|         /// <returns></returns>
 | ||
|         public Rectangle GetDisplayBounds(Rectangle bounds)
 | ||
|         {
 | ||
|             bounds.X -= HScrollOffset;
 | ||
| 
 | ||
|             if (VScrollBar.Inverted == true)
 | ||
|                 bounds.Y += VScrollOffset;
 | ||
|             else
 | ||
|                 bounds.Y -= VScrollOffset;
 | ||
| 
 | ||
|             return (bounds);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region GetElementAt
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the element at the given Point.
 | ||
|         /// </summary>
 | ||
|         /// <param name="pt"></param>
 | ||
|         /// <returns></returns>
 | ||
|         public override ChartVisualElement GetElementAt(Point pt)
 | ||
|         {
 | ||
|             if (InScrollBar(HScrollBar, pt))
 | ||
|                 return (HScrollBar);
 | ||
| 
 | ||
|             if (InScrollBar(VScrollBar, pt))
 | ||
|                 return (VScrollBar);
 | ||
| 
 | ||
|             foreach (ChartTitle title in Titles)
 | ||
|             {
 | ||
|                 if (title.Visible == true)
 | ||
|                 {
 | ||
|                     if (title.Bounds.Contains(pt))
 | ||
|                         return (title);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if (Legend.Visible == true)
 | ||
|             {
 | ||
|                 if (Legend.FrameBounds.Contains(pt))
 | ||
|                 {
 | ||
|                     ChartVisualElement item = Legend.GetElementAt(pt);
 | ||
| 
 | ||
|                     return (item ?? Legend);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             return (null);
 | ||
|         }
 | ||
| 
 | ||
|         #region InScrollBar
 | ||
| 
 | ||
|         private bool InScrollBar(ScrollBarLite scrollBar, Point pt)
 | ||
|         {
 | ||
|             if (scrollBar != null && scrollBar.Visible == true)
 | ||
|             {
 | ||
|                 if (scrollBar.Bounds.Contains(pt))
 | ||
|                     return (true);
 | ||
|             }
 | ||
| 
 | ||
|             return (false);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region GetHitArea
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the HitArea for the given Point.
 | ||
|         /// </summary>
 | ||
|         /// <param name="pt"></param>
 | ||
|         /// <returns></returns>
 | ||
|         public override ItemHitArea GetHitArea(Point pt)
 | ||
|         {
 | ||
|             Rectangle contentBounds = GetScrollBounds(ContentBounds);
 | ||
| 
 | ||
|             if (contentBounds.Contains(pt))
 | ||
|                 return (ItemHitArea.InContent);
 | ||
| 
 | ||
|             Rectangle frameBounds = GetScrollBounds(FrameBounds);
 | ||
| 
 | ||
|             if (frameBounds.Contains(pt))
 | ||
|                 return (ItemHitArea.InFrame);
 | ||
| 
 | ||
|             return (ItemHitArea.None);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region GetTitleByName
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Gets the defined Title with the given name.
 | ||
|         /// </summary>
 | ||
|         /// <param name="name"></param>
 | ||
|         /// <returns>ChartTitle or null</returns>
 | ||
|         public ChartTitle GetTitleByName(string name)
 | ||
|         {
 | ||
|             return (Titles[name]);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Style Support
 | ||
| 
 | ||
|         #region GetEffectiveContainerStyle
 | ||
| 
 | ||
|         internal ContainerVisualStyle GetEffectiveContainerStyle()
 | ||
|         {
 | ||
|             StyleState state = GetStyleState();
 | ||
| 
 | ||
|             return (EffectiveContainerStyles[state]);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region GetStyleState
 | ||
| 
 | ||
|         private StyleState GetStyleState()
 | ||
|         {
 | ||
|             StyleState state = StyleState.Default;
 | ||
| 
 | ||
|             if (IsMouseOver == true)
 | ||
|                 state |= StyleState.MouseOver;
 | ||
| 
 | ||
|             if (IsSelected == true)
 | ||
|                 state |= StyleState.Selected;
 | ||
| 
 | ||
|             return (state);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ApplyStyles
 | ||
| 
 | ||
|         public override void ApplyStyles(BaseVisualStyle style, StyleType cs)
 | ||
|         {
 | ||
|             base.ApplyStyles(style);
 | ||
| 
 | ||
|             ContainerVisualStyle cstyle = style as ContainerVisualStyle;
 | ||
| 
 | ||
|             if (cstyle != null)
 | ||
|             {
 | ||
|                 ApplyParentStyles(cstyle, Parent as ChartContainer, cs);
 | ||
| 
 | ||
|                 cstyle.ApplyStyle(ContainerVisualStyles[cs]);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #region ApplyParentStyles (ChartContainerVisualStyles)
 | ||
| 
 | ||
|         private void ApplyParentStyles(
 | ||
|             ContainerVisualStyle cstyle, ChartContainer item, StyleType cs)
 | ||
|         {
 | ||
|             if (item != null)
 | ||
|             {
 | ||
|                 ApplyParentStyles(cstyle, item.Parent as ChartContainer, cs);
 | ||
| 
 | ||
|                 ChartPanel panel = item as ChartPanel;
 | ||
| 
 | ||
|                 if (panel != null)
 | ||
|                 {
 | ||
|                     if (panel.DefaultVisualStyles.ContainerVisualStyles != null)
 | ||
|                         cstyle.ApplyStyle(panel.DefaultVisualStyles.ContainerVisualStyles[cs]);
 | ||
|                 }
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 ChartControl chartControl = ChartControl;
 | ||
| 
 | ||
|                 if (chartControl.BaseVisualStyles.ContainerVisualStyles != null)
 | ||
|                     cstyle.ApplyStyle(chartControl.BaseVisualStyles.ContainerVisualStyles[cs]);
 | ||
| 
 | ||
|                 if (chartControl.DefaultVisualStyles.ContainerVisualStyles != null)
 | ||
|                     cstyle.ApplyStyle(chartControl.DefaultVisualStyles.ContainerVisualStyles[cs]);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ApplyDefaults
 | ||
| 
 | ||
|         public override void ApplyDefaults(BaseVisualStyle style, StyleType cs)
 | ||
|         {
 | ||
|             ContainerVisualStyle cstyle = style as ContainerVisualStyle;
 | ||
| 
 | ||
|             if (cstyle != null)
 | ||
|             {
 | ||
|                 if (cstyle.BorderPattern == null)
 | ||
|                     cstyle.BorderPattern = new BorderPattern(LinePattern.Solid);
 | ||
| 
 | ||
|                 if (cstyle.DropShadow.Enabled == Tbool.NotSet)
 | ||
|                     cstyle.DropShadow.Enabled = Tbool.False;
 | ||
|             }
 | ||
| 
 | ||
|             base.ApplyDefaults(style, cs);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region InvalidateStyle
 | ||
| 
 | ||
|         ///<summary>
 | ||
|         ///Invalidate the cached Style
 | ||
|         ///</summary>
 | ||
|         public void InvalidateStyle()
 | ||
|         {
 | ||
|             ClearEffectiveStyles();
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ClearEffectiveStyles
 | ||
| 
 | ||
|         protected override void ClearEffectiveStyles()
 | ||
|         {
 | ||
|             _EffectiveContainerStyles.InvalidateStyles();
 | ||
| 
 | ||
|             if (_VScrollBar != null)
 | ||
|                 _VScrollBar.InvalidateStyle();
 | ||
| 
 | ||
|             if (_HScrollBar != null)
 | ||
|                 _HScrollBar.InvalidateStyle();
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ILegendData
 | ||
| 
 | ||
|         #region GetLegendItems
 | ||
| 
 | ||
|         public virtual List<ChartLegendItem> GetLegendData()
 | ||
|         {
 | ||
|             return (null);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region CompareTo
 | ||
| 
 | ||
|         public int CompareTo(object obj)
 | ||
|         {
 | ||
|             ChartContainer cobj = obj as ChartContainer;
 | ||
| 
 | ||
|             if (cobj != null)
 | ||
|             {
 | ||
|                 if (this.Equals(cobj) == true)
 | ||
|                     return (0);
 | ||
|             }
 | ||
| 
 | ||
|             return (-1);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Copy/CopyTo
 | ||
| 
 | ||
|         public override ChartVisualElement Copy()
 | ||
|         {
 | ||
|             ChartContainer copy = new ChartContainer();
 | ||
| 
 | ||
|             CopyTo(copy);
 | ||
| 
 | ||
|             return (copy);
 | ||
|         }
 | ||
| 
 | ||
|         public override void CopyTo(ChartVisualElement copy)
 | ||
|         {
 | ||
|             ChartContainer c = copy as ChartContainer;
 | ||
| 
 | ||
|             if (c != null)
 | ||
|             {
 | ||
|                 base.CopyTo(c);
 | ||
| 
 | ||
|                 c.AutoSizeMode = AutoSizeMode;
 | ||
| 
 | ||
|                 c.ContainerVisualStyles = (_ContainerVisualStyles != null) ? ContainerVisualStyles.Copy() : null;
 | ||
| 
 | ||
|                 c.EmptyText = EmptyText;
 | ||
|                 c.EnableEmptyTextMarkup = EnableEmptyTextMarkup;
 | ||
|                 c.EnablePanning = EnablePanning;
 | ||
|                 c.EnableSelection = EnableSelection;
 | ||
|                 c.FillWeight = FillWeight;
 | ||
|                 c.HScrollBarHeight = HScrollBarHeight;
 | ||
|                 c.HScrollBarVisible = HScrollBarVisible;
 | ||
| 
 | ||
|                 c.Legend = (_Legend != null) ? (ChartLegend)Legend.Copy() : null;
 | ||
| 
 | ||
|                 c.MatrixAlignEndColumn = MatrixAlignEndColumn;
 | ||
|                 c.MatrixAlignEndRow = MatrixAlignEndRow;
 | ||
|                 c.MatrixAlignStartColumn = MatrixAlignStartColumn;
 | ||
|                 c.MatrixAlignStartRow = MatrixAlignStartRow;
 | ||
|                 c.MatrixDisplayBounds = MatrixDisplayBounds;
 | ||
|                 c.MatrixDisplayOrder = MatrixDisplayOrder;
 | ||
|                 c.MinContentSize = MinContentSize;
 | ||
| 
 | ||
|                 c.Titles.Clear();
 | ||
| 
 | ||
|                 foreach (ChartTitle title in Titles)
 | ||
|                     c.Titles.Add((ChartTitle)title.Copy());
 | ||
| 
 | ||
|                 c.VScrollBarWidth = VScrollBarWidth;
 | ||
|                 c.VScrollBarVisible = VScrollBarVisible;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region GetSerialData
 | ||
| 
 | ||
|         internal override SerialElementCollection GetSerialData(string serialName)
 | ||
|         {
 | ||
|             SerialElementCollection sec = new SerialElementCollection();
 | ||
| 
 | ||
|             if (serialName != null)
 | ||
|             {
 | ||
|                 if (serialName.Equals("") == true)
 | ||
|                     serialName = "ChartContainer";
 | ||
| 
 | ||
|                 sec.AddStartElement(serialName);
 | ||
|             }
 | ||
| 
 | ||
|             sec.AddValue("AutoSizeMode", AutoSizeMode, AutoSizeMode.NotSet);
 | ||
| 
 | ||
|             if (_ContainerVisualStyles != null && _ContainerVisualStyles.IsEmpty == false)
 | ||
|                 sec.AddElement(_ContainerVisualStyles.GetSerialData("ContainerVisualStyles"));
 | ||
| 
 | ||
|             sec.AddValue("EmptyText", EmptyText, null);
 | ||
|             sec.AddValue("EnableEmptyTextMarkup", EnableEmptyTextMarkup, false);
 | ||
| 
 | ||
|             sec.AddValue("EnablePanning", EnablePanning, true);
 | ||
|             sec.AddValue("EnableSelection", EnableSelection, false);
 | ||
| 
 | ||
|             sec.AddValue("FillWeight", FillWeight, 100);
 | ||
| 
 | ||
|             sec.AddValue("HScrollBarHeight", HScrollBarHeight, 9);
 | ||
|             sec.AddValue("HScrollBarVisible", HScrollBarVisible, true);
 | ||
| 
 | ||
|             if (_HScrollBar != null)
 | ||
|                 sec.AddElement(_HScrollBar.GetSerialData("HScrollBar"));
 | ||
| 
 | ||
|             if (_Legend != null)
 | ||
|                 sec.AddElement(_Legend.GetSerialData("Legend"));
 | ||
| 
 | ||
|             sec.AddValue("MatrixAlignEndColumn", MatrixAlignEndColumn, false);
 | ||
|             sec.AddValue("MatrixAlignEndRow", MatrixAlignEndRow, false);
 | ||
|             sec.AddValue("MatrixAlignStartColumn", MatrixAlignStartColumn, false);
 | ||
|             sec.AddValue("MatrixAlignStartRow", MatrixAlignStartRow, false);
 | ||
| 
 | ||
|             ChartPanel panel = Parent as ChartPanel;
 | ||
| 
 | ||
|             if (panel == null || panel.AutoFillChartMatrix == false) 
 | ||
|             {
 | ||
|                 if (_MatrixDisplayBounds.IsEmpty == false)
 | ||
|                     sec.AddValue("MatrixDisplayBounds", MatrixDisplayBounds);
 | ||
|             }
 | ||
| 
 | ||
|             sec.AddValue("MatrixDisplayOrder", MatrixDisplayOrder, 0);
 | ||
|             sec.AddValue("MinContentSize", MinContentSize, new Size(100,100));
 | ||
| 
 | ||
|             if (_Titles != null && _Titles.Count > 0)
 | ||
|             {
 | ||
|                 sec.AddStartElement("Titles count=\"" + _Titles.Count + "\"");
 | ||
| 
 | ||
|                 foreach (ChartTitle title in _Titles)
 | ||
|                     sec.AddElement(title.GetSerialData(""));
 | ||
| 
 | ||
|                 sec.AddEndElement("Titles");
 | ||
|             }
 | ||
| 
 | ||
|             if (_VScrollBar != null)
 | ||
|                 sec.AddElement(_VScrollBar.GetSerialData("VScrollBar"));
 | ||
| 
 | ||
|             sec.AddValue("VScrollBarWidth", VScrollBarWidth, 9);
 | ||
|             sec.AddValue("VScrollBarVisible", VScrollBarVisible, true);
 | ||
| 
 | ||
|             sec.AddElement(base.GetSerialData(null));
 | ||
| 
 | ||
|             if (serialName != null)
 | ||
|                 sec.AddEndElement("ChartContainer");
 | ||
| 
 | ||
|             return (sec);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region PutSerialData
 | ||
| 
 | ||
|         #region ProcessValue
 | ||
| 
 | ||
|         internal override void ProcessValue(SerialElement se)
 | ||
|         {
 | ||
|             switch (se.Name)
 | ||
|             {
 | ||
|                 case "AutoSizeMode":
 | ||
|                     AutoSizeMode = (AutoSizeMode)se.GetValueEnum(typeof(AutoSizeMode));
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "EmptyText":
 | ||
|                     EmptyText = se.StringValue;
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "EnableEmptyTextMarkup":
 | ||
|                     EnableEmptyTextMarkup = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "EnablePanning":
 | ||
|                     EnablePanning = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "EnableSelection":
 | ||
|                     EnableSelection = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "FillWeight":
 | ||
|                     FillWeight = int.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "HScrollBarHeight":
 | ||
|                     HScrollBarHeight = int.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "HScrollBarVisible":
 | ||
|                     HScrollBarVisible = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MatrixAlignEndColumn":
 | ||
|                     MatrixAlignEndColumn = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MatrixAlignEndRow":
 | ||
|                     MatrixAlignEndRow = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MatrixAlignStartColumn":
 | ||
|                     MatrixAlignStartColumn = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MatrixAlignStartRow":
 | ||
|                     MatrixAlignStartRow = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MatrixDisplayBounds":
 | ||
|                     ChartPanel panel = Parent as ChartPanel;
 | ||
| 
 | ||
|                     if (panel == null || panel.AutoFillChartMatrix == false)
 | ||
|                         MatrixDisplayBounds = se.GetValueRect();
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MatrixDisplayOrder":
 | ||
|                     MatrixDisplayOrder = int.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "MinContentSize":
 | ||
|                     MinContentSize = se.GetValueSize();
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "VScrollBarWidth":
 | ||
|                     VScrollBarWidth = int.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "VScrollBarVisible":
 | ||
|                     VScrollBarVisible = bool.Parse(se.StringValue);
 | ||
|                     break;
 | ||
| 
 | ||
|                 default:
 | ||
|                     base.ProcessValue(se);
 | ||
|                     break;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region ProcessCollection
 | ||
| 
 | ||
|         internal override void ProcessCollection(SerialElement se)
 | ||
|         {
 | ||
|             SerialElementCollection sec = se.Sec;
 | ||
| 
 | ||
|             switch (se.Name)
 | ||
|             {
 | ||
|                 case "ChartTitle":
 | ||
|                     string name = sec.GetItemValue("Name");
 | ||
| 
 | ||
|                     ChartTitle title = GetTitleByName(name);
 | ||
| 
 | ||
|                     if (title != null)
 | ||
|                         Titles.Remove(title);
 | ||
| 
 | ||
|                     title = new ChartTitle(name);
 | ||
| 
 | ||
|                     sec.PutSerialData(title);
 | ||
| 
 | ||
|                     Titles.Add(title);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "ContainerVisualStyles":
 | ||
|                     sec.PutSerialData(ContainerVisualStyles);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "HScrollBar":
 | ||
|                     sec.PutSerialData(HScrollBar);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "Legend":
 | ||
|                     sec.PutSerialData(Legend);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "Titles":
 | ||
|                     sec.PutSerialData(this);
 | ||
|                     break;
 | ||
| 
 | ||
|                 case "VScrollBar":
 | ||
|                     sec.PutSerialData(VScrollBar);
 | ||
|                     break;
 | ||
| 
 | ||
|                 default:
 | ||
|                     base.ProcessCollection(se);
 | ||
|                     break;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region States
 | ||
| 
 | ||
|         [Flags]
 | ||
|         private enum States : uint
 | ||
|         {
 | ||
|             AutoGenSeriesCollection = (1U << 0),
 | ||
| 
 | ||
|             EnableEmptyTextMarkup = (1U << 1),
 | ||
|             EnablePanning = (1U << 2),
 | ||
| 
 | ||
|             ShowPointsToolTips = (1U << 3),
 | ||
|             ShowSeriesToolTips = (1U << 4),
 | ||
| 
 | ||
|             HScrollBarEnabled = (1U << 5),
 | ||
|             VScrollBarEnabled = (1U << 6),
 | ||
|             HScrollBarVisible = (1U << 7),
 | ||
|             VScrollBarVisible = (1U << 8),
 | ||
| 
 | ||
|             LayoutBoundsValid = (1U << 9),
 | ||
|             IsSelected = (1U << 10),
 | ||
| 
 | ||
|             MatrixAlignStartColumn = (1U << 11),
 | ||
|             MatrixAlignEndColumn = (1U << 12),
 | ||
|             MatrixAlignStartRow = (1U << 13),
 | ||
|             MatrixAlignEndRow = (1U << 14),
 | ||
| 
 | ||
|             MatrixColumnAligned = (1U << 15),
 | ||
|             MatrixRowAligned = (1U << 16),
 | ||
| 
 | ||
|             EnableSelection = (1U << 17),
 | ||
|         }
 | ||
| 
 | ||
|         #region TestState
 | ||
| 
 | ||
|         private bool TestState(States state)
 | ||
|         {
 | ||
|             return ((_States & state) == state);
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region SetState
 | ||
| 
 | ||
|         private void SetState(States state, bool value)
 | ||
|         {
 | ||
|             if (value == true)
 | ||
|                 _States |= state;
 | ||
|             else
 | ||
|                 _States &= ~state;
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region IDisposable
 | ||
| 
 | ||
|         public override void Dispose()
 | ||
|         {
 | ||
|             ContainerVisualStyles = null;
 | ||
|             Titles = null;
 | ||
| 
 | ||
|             base.Dispose();
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
|     }
 | ||
| 
 | ||
|     #region enums
 | ||
| 
 | ||
|     #region AutoSizeMode
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// Defines auto-sizing mode.
 | ||
|     /// </summary>
 | ||
|     public enum AutoSizeMode
 | ||
|     {
 | ||
|         /// <summary>
 | ||
|         /// NotSet (None is default)
 | ||
|         /// </summary>
 | ||
|         NotSet = -1,
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// No Auto-sizing will take place.
 | ||
|         /// </summary>
 | ||
|         None,
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Size will be determined by the fill weight.
 | ||
|         /// </summary>
 | ||
|         Fill,
 | ||
|     }
 | ||
| 
 | ||
|     #endregion
 | ||
| 
 | ||
|     #endregion
 | ||
| }
 |