﻿using System;
using System.Data;
using System.Collections;
using System.Globalization;
using System.ComponentModel;

namespace TwinDataGridSample
{
    public partial class CustomBindingSource : Component, IListSource
    {
        public CustomBindingSource()
            : base()
        {
            this.InitializeComponent();
            this.randomizer = new Random();
            this.minimumValue = Int32.MinValue;
            this.maximumValue = Int32.MaxValue;
            this.rowCount = 10;
            this.columnCount = 5;
            this.liveBinding = true;
        }

        private Random randomizer;
        private int minimumValue;
        private int maximumValue;
        private int rowCount;
        private int columnCount;
        private bool liveBinding;

        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public bool ContainsListCollection
        {
            get { return false; }
        }

        [Browsable(true)]
        [DefaultValue(Int32.MinValue)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int MinimumValue
        {
            get { return this.minimumValue; }
            set
            {
                if (value > this.maximumValue)
                    throw new ArgumentException("Invalid minimum value.", "value");

                this.minimumValue = value;
            }
        }

        [Browsable(true)]
        [DefaultValue(Int32.MaxValue)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int MaximumValue
        {
            get { return this.maximumValue; }
            set
            {
                if (value < this.minimumValue)
                    throw new ArgumentException("Invalid maximum value.", "value");

                this.maximumValue = value;
            }
        }

        [Browsable(true)]
        [DefaultValue(10)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int RowCount
        {
            get { return this.rowCount; }
            set
            {
                if (value < 1)
                    throw new ArgumentException("Row count is invalid.", "value");

                this.rowCount = value;
            }
        }

        [Browsable(true)]
        [DefaultValue(5)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int ColumnCount
        {
            get { return this.columnCount; }
            set
            {
                if (value < 1)
                    throw new ArgumentException("Column count is invalid.", "value");

                this.columnCount = value;
            }
        }

        [Browsable(true)]
        [DefaultValue(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool LiveBinding
        {
            get { return this.liveBinding; }
            set { this.liveBinding = value; }
        }

        public IList GetList()
        {
            DataTable table = new DataTable();

            if (this.DesignMode && !this.liveBinding)
                return table.DefaultView;

            for (int i = 0; i < this.columnCount; i++)
            {
                DataColumn eachColumn = table.Columns.Add();

                eachColumn.ColumnName = String.Format(
                    CultureInfo.CurrentCulture,
                    "Column{0}", (i + 1));
                eachColumn.Caption = String.Format(
                    CultureInfo.CurrentCulture,
                    "Value #{0}", (i + 1));
                eachColumn.AllowDBNull = false;
                eachColumn.DataType = typeof(int);
                eachColumn.DefaultValue = 0;
            }

            for (int i = 0; i < this.rowCount; i++)
            {
                object[] dataArray = new object[this.columnCount];

                for (int j = 0; j < this.columnCount; j++)
                {
                    dataArray[j] = this.randomizer.Next(
                        this.minimumValue,
                        this.maximumValue);
                }

                table.Rows.Add(dataArray);
            }

            return table.DefaultView;
        }
    }
}

