1047 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1047 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Charts
 | 
						|
{
 | 
						|
    [TypeConverter(typeof(BlankExpandableObjectConverter))]
 | 
						|
    public class ChartMatrix : IProcessSerialElement
 | 
						|
    {
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private States _States;
 | 
						|
 | 
						|
        private int _Width;
 | 
						|
        private int _Height;
 | 
						|
 | 
						|
        private ChartContainer[,] _LocalArray;
 | 
						|
        private Rectangle[,] _BoundsArray;
 | 
						|
 | 
						|
        private Point _ScrollOffset;
 | 
						|
 | 
						|
        private MatrixRowColProperties[] _ColumnProperties;
 | 
						|
        private MatrixRowColProperties[] _RowProperties;
 | 
						|
 | 
						|
        private Size _DefaultCellSize = new Size(100, 100);
 | 
						|
 | 
						|
        private AutoSizeMode _AutoSizeMode = AutoSizeMode.NotSet;
 | 
						|
        private DividerLines _DividerLines = DividerLines.NotSet;
 | 
						|
 | 
						|
        private ChartContainer _Parent;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructors
 | 
						|
 | 
						|
        public ChartMatrix()
 | 
						|
            : this(0, 0)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        public ChartMatrix(Size size)
 | 
						|
            : this(size.Width, size.Height)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        public ChartMatrix(int width, int height)
 | 
						|
        {
 | 
						|
            CreateMatrix(width, height);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        #region AutoSizeMode
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// Gets or sets the default mode used to size each matrix row/col (by FillWeight, etc).
 | 
						|
        ///</summary>
 | 
						|
        [DefaultValue(AutoSizeMode.NotSet), Category("Layout")]
 | 
						|
        [Description("Indicates the default mode used to size each matrix row/col (by FillWeight, etc).")]
 | 
						|
        public AutoSizeMode AutoSizeMode
 | 
						|
        {
 | 
						|
            get { return (_AutoSizeMode); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _AutoSizeMode)
 | 
						|
                {
 | 
						|
                    _AutoSizeMode = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("AutoSizeMode");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ColumnProperties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Get a reference to the matrix column properties.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public MatrixRowColProperties[] ColumnProperties
 | 
						|
        {
 | 
						|
            get { return (_ColumnProperties);  }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DefaultCellSize
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// Gets or sets the default minimum size for each matrix cell.
 | 
						|
        ///</summary>
 | 
						|
        [ Category("Layout")]
 | 
						|
        [Description("Indicates the default minimum size for each matrix cell.")]
 | 
						|
        public Size DefaultCellSize
 | 
						|
        {
 | 
						|
            get { return (_DefaultCellSize); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _DefaultCellSize)
 | 
						|
                {
 | 
						|
                    _DefaultCellSize = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("DefaultCellSize");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        internal virtual bool ShouldSerializeDefaultCellSize()
 | 
						|
        {
 | 
						|
            return (_DefaultCellSize != new Size(100, 100));
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        internal virtual void ResetDefaultCellSize()
 | 
						|
        {
 | 
						|
            DefaultCellSize = new Size(100, 100);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DividerLines
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets which Divider lines (horizontal and/or vertical)
 | 
						|
        /// are displayed between each Matrix cell.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(DividerLines.NotSet), Category("Appearance")]
 | 
						|
        [Description("Indicates which Divider lines (horizontal and/or vertical) are displayed between each Matrix cell.")]
 | 
						|
        public DividerLines DividerLines
 | 
						|
        {
 | 
						|
            get { return (_DividerLines); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_DividerLines != value)
 | 
						|
                {
 | 
						|
                    _DividerLines = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("DividerLines");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Indexer [,]
 | 
						|
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public ChartContainer this[int x, int y]
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                ValidateXandY(x, y);
 | 
						|
 | 
						|
                return (_LocalArray[x, y]);
 | 
						|
            }
 | 
						|
 | 
						|
            internal set
 | 
						|
            {
 | 
						|
                ValidateXandY(x, y);
 | 
						|
 | 
						|
                if (value is IComparable == true)
 | 
						|
                {
 | 
						|
                    if (((IComparable)value).CompareTo(_LocalArray[x, y]) == 0)
 | 
						|
                        return;
 | 
						|
                }
 | 
						|
 | 
						|
                _LocalArray[x, y] = value;
 | 
						|
 | 
						|
                if (value != null)
 | 
						|
                    value.Parent = Parent;
 | 
						|
 | 
						|
                OnPropertyChanged("Value");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Indexer []
 | 
						|
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public ChartContainer this[int xy]
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                ValidateXY(xy);
 | 
						|
 | 
						|
                int y = xy / _Width;
 | 
						|
                int x = xy % _Width;
 | 
						|
 | 
						|
                return (this[x, y]);
 | 
						|
            }
 | 
						|
 | 
						|
            internal set
 | 
						|
            {
 | 
						|
                ValidateXY(xy);
 | 
						|
 | 
						|
                int y = xy / _Width;
 | 
						|
                int x = xy % _Width;
 | 
						|
 | 
						|
                this[x, y] = value;
 | 
						|
 | 
						|
                OnPropertyChanged("Value");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IsEmpty
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether the matrix is empty.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool IsEmpty
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                for (int i = 0; i < _Width; i++)
 | 
						|
                {
 | 
						|
                    for (int j = 0; j < _Height; j++)
 | 
						|
                    {
 | 
						|
                        if (_LocalArray[i, j] != null)
 | 
						|
                            return (false);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                return (true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Height
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the matrix height.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public int Height
 | 
						|
        {
 | 
						|
            get { return (_Height); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _Height)
 | 
						|
                {
 | 
						|
                    _Height = value;
 | 
						|
 | 
						|
                    CreateMatrix(_Width, _Height);
 | 
						|
 | 
						|
                    OnPropertyChanged("Height");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RowProperties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Get a reference to the matrix row properties.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public MatrixRowColProperties[] RowProperties
 | 
						|
        {
 | 
						|
            get { return (_RowProperties); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Size
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the matrix size.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public Size Size
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                int x = _Width;
 | 
						|
                int y = _Height;
 | 
						|
 | 
						|
                return (new Size(x, y));
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value.Width != _Width || value.Height != _Height)
 | 
						|
                {
 | 
						|
                    int x = value.Width;
 | 
						|
                    int y = value.Height;
 | 
						|
 | 
						|
                    CreateMatrix(x, y);
 | 
						|
 | 
						|
                    OnPropertyChanged("Size");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Width
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the matrix width.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public int Width
 | 
						|
        {
 | 
						|
            get { return (_Width); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _Width)
 | 
						|
                {
 | 
						|
                    _Width = value;
 | 
						|
 | 
						|
                    CreateMatrix(_Width, _Height);
 | 
						|
 | 
						|
                    OnPropertyChanged("Width");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal properties
 | 
						|
 | 
						|
        #region BoundsArray
 | 
						|
 | 
						|
        internal Rectangle[,] BoundsArray
 | 
						|
        {
 | 
						|
            get { return (_BoundsArray); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Parent
 | 
						|
 | 
						|
        internal ChartContainer Parent
 | 
						|
        {
 | 
						|
            get { return (_Parent); }
 | 
						|
            set { _Parent = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ScrollOffset
 | 
						|
 | 
						|
        internal Point ScrollOffset
 | 
						|
        {
 | 
						|
            get { return (_ScrollOffset); }
 | 
						|
            set { _ScrollOffset = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ValidateXandY
 | 
						|
 | 
						|
        protected void ValidateXandY(int x, int y)
 | 
						|
        {
 | 
						|
            if ((uint)x >= _Width)
 | 
						|
                throw new IndexOutOfRangeException("Invalid 'x' value.");
 | 
						|
 | 
						|
            if ((uint)y >= _Height)
 | 
						|
                throw new IndexOutOfRangeException("Invalid 'y' value.");
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ValidateXY
 | 
						|
 | 
						|
        protected void ValidateXY(int xy)
 | 
						|
        {
 | 
						|
            int xyMax = _Width * _Height;
 | 
						|
 | 
						|
            if (xy >= xyMax)
 | 
						|
                throw new IndexOutOfRangeException("Invalid 'xy' value.");
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CreateMatrix
 | 
						|
 | 
						|
        private void CreateMatrix(int width, int height)
 | 
						|
        {
 | 
						|
            if (width < 0)
 | 
						|
                throw new Exception("Width cannot be negative");
 | 
						|
 | 
						|
            if (height < 0)
 | 
						|
                throw new Exception("Heigth cannot be negative");
 | 
						|
 | 
						|
            _Width = width;
 | 
						|
            _Height = height;
 | 
						|
 | 
						|
            _LocalArray = new ChartContainer[width, height];
 | 
						|
            _BoundsArray = new Rectangle[width, height];
 | 
						|
 | 
						|
            CreateProperties(ref _RowProperties, height);
 | 
						|
            CreateProperties(ref _ColumnProperties, width);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CreateProperties
 | 
						|
 | 
						|
        private void CreateProperties(ref MatrixRowColProperties[] properties, int length)
 | 
						|
        {
 | 
						|
            ReleaseProperties(ref properties);
 | 
						|
 | 
						|
            properties = new MatrixRowColProperties[length];
 | 
						|
 | 
						|
            for (int i = 0; i < length; i++)
 | 
						|
            {
 | 
						|
                properties[i] = new MatrixRowColProperties();
 | 
						|
                properties[i].PropertyChanged += Matrix_PropertyChanged;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ReleaseProperties
 | 
						|
 | 
						|
        private void ReleaseProperties(ref MatrixRowColProperties[] properties)
 | 
						|
        {
 | 
						|
            if (properties != null)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < properties.Length; i++)
 | 
						|
                {
 | 
						|
                    properties[i].PropertyChanged -= Matrix_PropertyChanged;
 | 
						|
                    properties[i] = null;
 | 
						|
                }
 | 
						|
 | 
						|
                properties = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Clear
 | 
						|
 | 
						|
        public void Clear()
 | 
						|
        {
 | 
						|
            CreateMatrix(_Width, _Height);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetElementAt
 | 
						|
 | 
						|
        public ChartContainer GetElementAt(Point pt)
 | 
						|
        {
 | 
						|
            for (int i = 0; i < _Width; i++)
 | 
						|
            {
 | 
						|
                for (int j = 0; j < _Height; j++)
 | 
						|
                {
 | 
						|
                    if (_LocalArray[i, j] != null)
 | 
						|
                    {
 | 
						|
                        Rectangle bounds = _BoundsArray[i, j];
 | 
						|
 | 
						|
                        bounds.X -= _ScrollOffset.X;
 | 
						|
                        bounds.Y -= _ScrollOffset.Y;
 | 
						|
 | 
						|
                        if (bounds.Contains(pt))
 | 
						|
                            return (_LocalArray[i, j]);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (null);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetMatrixCoordAt
 | 
						|
 | 
						|
        public bool GetMatrixCoordAt(Point pt, ref int column, ref int row)
 | 
						|
        {
 | 
						|
            for (int i = 0; i < _Width; i++)
 | 
						|
            {
 | 
						|
                for (int j = 0; j < _Height; j++)
 | 
						|
                {
 | 
						|
                    Rectangle bounds = _BoundsArray[i, j];
 | 
						|
 | 
						|
                    bounds.X -= _ScrollOffset.X;
 | 
						|
                    bounds.Y -= _ScrollOffset.Y;
 | 
						|
 | 
						|
                    if (bounds.Contains(pt))
 | 
						|
                    {
 | 
						|
                        column = i;
 | 
						|
                        row = j;
 | 
						|
 | 
						|
                        return (true);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (false);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetMatrixCoordOf
 | 
						|
 | 
						|
        public bool GetMatrixCoordOf(ChartContainer item, ref int row, ref int column)
 | 
						|
        {
 | 
						|
            if (item != null)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < _Width; i++)
 | 
						|
                {
 | 
						|
                    for (int j = 0; j < _Height; j++)
 | 
						|
                    {
 | 
						|
                        if (item.Equals(_LocalArray[i, j]))
 | 
						|
                        {
 | 
						|
                            column = i;
 | 
						|
                            row = j;
 | 
						|
 | 
						|
                            return (true);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (false);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Matrix_PropertyChanged
 | 
						|
 | 
						|
        void Matrix_PropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
						|
        {
 | 
						|
            OnPropertyChanged(e);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region INotifyPropertyChanged Members
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when property value has changed.
 | 
						|
        /// </summary>
 | 
						|
        public event PropertyChangedEventHandler PropertyChanged;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the PropertyChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Event arguments</param>
 | 
						|
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
 | 
						|
        {
 | 
						|
            PropertyChangedEventHandler eh = PropertyChanged;
 | 
						|
 | 
						|
            if (eh != null)
 | 
						|
                eh(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Default PropertyChanged processing
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="s"></param>
 | 
						|
        protected void OnPropertyChanged(string s)
 | 
						|
        {
 | 
						|
            if (PropertyChanged != null)
 | 
						|
                OnPropertyChanged(new PropertyChangedEventArgs(s));
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Copy/CopyTo
 | 
						|
 | 
						|
        public ChartMatrix Copy()
 | 
						|
        {
 | 
						|
            ChartMatrix copy = new ChartMatrix();
 | 
						|
 | 
						|
            CopyTo(copy);
 | 
						|
 | 
						|
            return (copy);
 | 
						|
        }
 | 
						|
 | 
						|
        public void CopyTo(ChartMatrix c)
 | 
						|
        {
 | 
						|
            c.AutoSizeMode = AutoSizeMode;
 | 
						|
            c.DividerLines = DividerLines;
 | 
						|
 | 
						|
            c.Size = Size;
 | 
						|
 | 
						|
            if (ColumnProperties != null)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < ColumnProperties.Length; i++)
 | 
						|
                    ColumnProperties[i].CopyTo(c.ColumnProperties[i]);
 | 
						|
            }
 | 
						|
 | 
						|
            if (RowProperties != null)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < RowProperties.Length; i++)
 | 
						|
                    RowProperties[i].CopyTo(c.RowProperties[i]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetSerialData
 | 
						|
 | 
						|
        internal SerialElementCollection GetSerialData()
 | 
						|
        {
 | 
						|
            return (GetSerialData(true));
 | 
						|
        }
 | 
						|
 | 
						|
        internal SerialElementCollection GetSerialData(bool root)
 | 
						|
        {
 | 
						|
            SerialElementCollection sec = new SerialElementCollection();
 | 
						|
 | 
						|
            if (root == true)
 | 
						|
                sec.AddStartElement("ChartMatrix");
 | 
						|
 | 
						|
            sec.AddValue("AutoSizeMode", AutoSizeMode, AutoSizeMode.NotSet);
 | 
						|
            sec.AddValue("DividerLines", DividerLines, DividerLines.NotSet);
 | 
						|
 | 
						|
            ChartPanel panel = Parent as ChartPanel;
 | 
						|
                
 | 
						|
            if (panel != null)
 | 
						|
            {
 | 
						|
                if (panel.AutoSizeChartMatrix == false)
 | 
						|
                    sec.AddValue("Size", Size, Size.Empty);
 | 
						|
            }
 | 
						|
 | 
						|
            if (AutoSizeMode == AutoSizeMode.None)
 | 
						|
            {
 | 
						|
                if (ColumnProperties != null && ColumnProperties.Length > 0)
 | 
						|
                {
 | 
						|
                    sec.AddStartElement("ColumnProperties count=\"" + ColumnProperties.Length + "\"");
 | 
						|
 | 
						|
                    foreach (MatrixRowColProperties rcp in ColumnProperties)
 | 
						|
                        sec.AddElement(rcp.GetSerialData());
 | 
						|
 | 
						|
                    sec.AddEndElement("ColumnProperties");
 | 
						|
                }
 | 
						|
 | 
						|
                if (RowProperties != null && RowProperties.Length > 0)
 | 
						|
                {
 | 
						|
                    sec.AddStartElement("RowProperties count=\"" + RowProperties.Length + "\"");
 | 
						|
 | 
						|
                    foreach (MatrixRowColProperties rcp in RowProperties)
 | 
						|
                        sec.AddElement(rcp.GetSerialData());
 | 
						|
 | 
						|
                    sec.AddEndElement("RowProperties");
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (root == true)
 | 
						|
                sec.AddEndElement("ChartMatrix");
 | 
						|
 | 
						|
            return (sec);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region PutSerialData
 | 
						|
 | 
						|
        #region ProcessValue
 | 
						|
 | 
						|
        void IProcessSerialElement.ProcessValue(SerialElement se)
 | 
						|
        {
 | 
						|
            ChartPanel panel = Parent as ChartPanel;
 | 
						|
                
 | 
						|
            switch (se.Name)
 | 
						|
            {
 | 
						|
                case "AutoSizeMode":
 | 
						|
                    AutoSizeMode = (AutoSizeMode)se.GetValueEnum(typeof(AutoSizeMode));
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "DividerLines":
 | 
						|
                    DividerLines = (DividerLines)se.GetValueEnum(typeof(DividerLines));
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "Size":
 | 
						|
                    if (panel != null)
 | 
						|
                    {
 | 
						|
                        if (panel.AutoSizeChartMatrix == false)
 | 
						|
                            Size = se.GetValueSize();
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
 | 
						|
                default:
 | 
						|
                    throw new Exception("Unknown Serial Value (" + se.Name + ")");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ProcessCollection
 | 
						|
 | 
						|
        private MatrixRowColProperties[] _RcProperties;
 | 
						|
 | 
						|
        void IProcessSerialElement.ProcessCollection(SerialElement se)
 | 
						|
        {
 | 
						|
            SerialElementCollection sec = se.Sec;
 | 
						|
 | 
						|
            switch (se.Name)
 | 
						|
            {
 | 
						|
                case "ColumnProperties":
 | 
						|
                    _RcProperties = ColumnProperties;
 | 
						|
                    sec.PutSerialData(this);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "RowProperties":
 | 
						|
                    _RcProperties = RowProperties;
 | 
						|
                    sec.PutSerialData(this);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "MatrixRowColProperties":
 | 
						|
                    sec.PutSerialData(_RcProperties[se.ValueIndex]);
 | 
						|
                    break;
 | 
						|
 | 
						|
                default:
 | 
						|
                    throw new Exception("Unknown Serial Collection (" + se.Name + ")");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region States
 | 
						|
 | 
						|
        [Flags]
 | 
						|
        private enum States : uint
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        #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 virtual void Dispose()
 | 
						|
        {
 | 
						|
            ReleaseProperties(ref _RowProperties);
 | 
						|
            ReleaseProperties(ref _ColumnProperties);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    [TypeConverter(typeof(BlankExpandableObjectConverter))]
 | 
						|
    public class MatrixRowColProperties : IProcessSerialElement, INotifyPropertyChanged
 | 
						|
    {
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private int _FillWeight = 100;
 | 
						|
        private int _MinimumLength = 0;
 | 
						|
        private int _Length;
 | 
						|
 | 
						|
        private AutoSizeMode _AutoSizeMode = AutoSizeMode.NotSet;
 | 
						|
        private bool _AlignContentBounds = true;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        #region AlignContentBounds
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// Gets or sets whether the matrix row/col has its content bounds aligned.
 | 
						|
        ///</summary>
 | 
						|
        [DefaultValue(true), Category("Data")]
 | 
						|
        [Description("Indicates the matrix row/col has its content bounds aligned.")]
 | 
						|
        public bool AlignContentBounds
 | 
						|
        {
 | 
						|
            get { return (_AlignContentBounds); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _AlignContentBounds)
 | 
						|
                {
 | 
						|
                    _AlignContentBounds = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("AlignContentBounds");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region AutoSizeMode
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// Gets or sets the mode used to size the matrix row/col.
 | 
						|
        ///</summary>
 | 
						|
        [DefaultValue(AutoSizeMode.NotSet), Category("Data")]
 | 
						|
        [Description("Indicates the mode used to sice the matrix row/col.")]
 | 
						|
        public AutoSizeMode AutoSizeMode
 | 
						|
        {
 | 
						|
            get { return (_AutoSizeMode); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _AutoSizeMode)
 | 
						|
                {
 | 
						|
                    _AutoSizeMode = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("AutoSizeMode");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region FillWeight
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value which, when AutoSizeMode is Fill,
 | 
						|
        /// represents the width of the row/col relative to the widths
 | 
						|
        /// of other fill-mode row/col items (default value is 100).
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(100), Category("Sizing")]
 | 
						|
        [Description("Indicates a value which, when AutoSizeMode is Fill, represents the width of the row/col relative to the widths of other fill-mode row/col items (default value is 100).")]
 | 
						|
        public int FillWeight
 | 
						|
        {
 | 
						|
            get { return (_FillWeight); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _FillWeight)
 | 
						|
                {
 | 
						|
                    _FillWeight = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("FillWeight");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Length
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value which represents the length (in pixels)
 | 
						|
        /// that the row/col is to occupy.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(0), Category("Sizing")]
 | 
						|
        [Description("Indicates a value which represents the length (in pixels) that the row/col is to occupy.")]
 | 
						|
        public int Length
 | 
						|
        {
 | 
						|
            get { return (_Length); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _Length)
 | 
						|
                {
 | 
						|
                    _Length = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("Length");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MinimumLength
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value which represents the minimum length (in pixels)
 | 
						|
        /// that the row/col can occupy.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(0), Category("Sizing")]
 | 
						|
        [Description("Indicates a value which represents the minimum length (in pixels) that the row/col can occupy.")]
 | 
						|
        public int MinimumLength
 | 
						|
        {
 | 
						|
            get { return (_MinimumLength); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _MinimumLength)
 | 
						|
                {
 | 
						|
                    _MinimumLength = value;
 | 
						|
 | 
						|
                    OnPropertyChanged("MinimumLength");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CopyTo
 | 
						|
 | 
						|
        public void CopyTo(MatrixRowColProperties c)
 | 
						|
        {
 | 
						|
            c.AlignContentBounds = AlignContentBounds;
 | 
						|
            c.AutoSizeMode = AutoSizeMode;
 | 
						|
            c.FillWeight = FillWeight;
 | 
						|
            c.Length = Length;
 | 
						|
            c.MinimumLength = MinimumLength;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetSerialData
 | 
						|
 | 
						|
        internal SerialElementCollection GetSerialData()
 | 
						|
        {
 | 
						|
            return (GetSerialData(true));
 | 
						|
        }
 | 
						|
 | 
						|
        internal SerialElementCollection GetSerialData(bool root)
 | 
						|
        {
 | 
						|
            SerialElementCollection sec = new SerialElementCollection();
 | 
						|
 | 
						|
            if (root == true)
 | 
						|
                sec.AddStartElement("MatrixRowColProperties");
 | 
						|
 | 
						|
            sec.AddValue("AlignContentBounds", AlignContentBounds, true);
 | 
						|
            sec.AddValue("AutoSizeMode", AutoSizeMode, AutoSizeMode.NotSet);
 | 
						|
            sec.AddValue("FillWeight", FillWeight, 100);
 | 
						|
            sec.AddValue("Length", Length, 0);
 | 
						|
            sec.AddValue("MinimumLength", MinimumLength, 0);
 | 
						|
 | 
						|
            if (root == true)
 | 
						|
                sec.AddEndElement("MatrixRowColProperties");
 | 
						|
 | 
						|
            return (sec);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region PutSerialData
 | 
						|
 | 
						|
        #region ProcessValue
 | 
						|
 | 
						|
        void IProcessSerialElement.ProcessValue(SerialElement se)
 | 
						|
        {
 | 
						|
            switch (se.Name)
 | 
						|
            {
 | 
						|
                case "AlignContentBounds":
 | 
						|
                    AlignContentBounds = bool.Parse(se.StringValue);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "AutoSizeMode":
 | 
						|
                    AutoSizeMode = (AutoSizeMode)se.GetValueEnum(typeof(AutoSizeMode));
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "FillWeight":
 | 
						|
                    FillWeight = int.Parse(se.StringValue);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "Length":
 | 
						|
                    Length = int.Parse(se.StringValue);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "MinimumLength":
 | 
						|
                    MinimumLength = int.Parse(se.StringValue);
 | 
						|
                    break;
 | 
						|
 | 
						|
                default:
 | 
						|
                    throw new Exception("Unknown Serial Value (" + se.Name + ")");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ProcessCollection
 | 
						|
 | 
						|
        void IProcessSerialElement.ProcessCollection(SerialElement se)
 | 
						|
        {
 | 
						|
            throw new Exception("Unknown Serial Collection (" + se.Name + ")");
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region INotifyPropertyChanged Members
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when property value has changed.
 | 
						|
        /// </summary>
 | 
						|
        public event PropertyChangedEventHandler PropertyChanged;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the PropertyChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Event arguments</param>
 | 
						|
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
 | 
						|
        {
 | 
						|
            PropertyChangedEventHandler eh = PropertyChanged;
 | 
						|
 | 
						|
            if (eh != null)
 | 
						|
                eh(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Default PropertyChanged processing
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="s"></param>
 | 
						|
        protected void OnPropertyChanged(string s)
 | 
						|
        {
 | 
						|
            if (PropertyChanged != null)
 | 
						|
                OnPropertyChanged(new PropertyChangedEventArgs(s));
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |