using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Data;

namespace Mesnac.Controls.Feeding
{
    [ToolboxBitmap(typeof(System.Windows.Forms.Label))]
    public partial class AlarmLabel : Label
    {
        #region 字段定义

        private string _dataName;
        private DataTable _data;
        private DataTable _cloneData;
        private int _alarmWord1;            //报警地址字1
        private int _alarmWord2;            //报警地址字2
        private string _alarmName1;         //报警变量1
        private string _alarmName2;         //报警变量2
        private int _alarmValue1;           //报警值1
        private int _alarmValue2;           //报警值2
        private bool _isMuilt;              //是否换行显示
        private bool _isScroll = false;     //是否滚动显示
        private int _scrollStep = 20;       //滚动步长
        public string Msg1 = string.Empty;//第一块报警信息
        public string Msg2 = string.Empty;//第二块报警信息
        string split = ";";                 //报警信息分割符
        string enter = "\r\n";              //报警信息换行符
        private string _controlAlarmValue;  //控件报警信息
        private string _controlAlarmName;   //控件报警动画字段        

        #endregion

        #region 构造方法

        public AlarmLabel()
        {
            InitializeComponent();
            this.AutoSize = true;
        }

        public AlarmLabel(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

        #endregion

        #region 属性
        /// <summary>
        /// 报警值1
        /// </summary>
        public int AlarmValue1
        {
            get { return _alarmValue1; }
            set
            {
                if (this._alarmValue1 != value)
                {
                    _alarmValue1 = value;
                    Msg1 = string.Empty;
                    int[] values = ParseBinaryValue(_alarmValue1, 16);
                    Msg1 = GetAlarmInfo1(values, 16, _alarmWord1);
                    //this.Text = Msg1 + Msg2;
                    string temp = String.Empty;
                    if (_isMuilt)
                    {
                        temp = String.IsNullOrEmpty(this._controlAlarmValue) ? String.Empty : this._controlAlarmValue.Replace(",", enter);
                    }
                    else
                    {
                        temp = String.IsNullOrEmpty(this._controlAlarmValue) ? String.Empty : this._controlAlarmValue.Replace(",", split);
                    }
                    this.Text = Msg1 + Msg2 + temp;
                }
                if (this._isScroll)
                {
                    this.ProcessScroll();
                }
            }
        }
        /// <summary>
        /// 报警值2
        /// </summary>
        public int AlarmValue2
        {
            get { return _alarmValue2; }
            set
            {
                if (this._alarmValue2 != value)
                {
                    _alarmValue2 = value;
                    Msg2 = string.Empty;
                    int[] values = ParseBinaryValue(_alarmValue2, 16);
                    Msg2 = GetAlarmInfo2(values, 16, _alarmWord2);
                    //this.Text = Msg1 + Msg2;
                    string temp = String.Empty;
                    if (_isMuilt)
                    {
                        temp = String.IsNullOrEmpty(this._controlAlarmValue) ? String.Empty : this._controlAlarmValue.Replace(",", enter);
                    }
                    else
                    {
                        temp = String.IsNullOrEmpty(this._controlAlarmValue) ? String.Empty : this._controlAlarmValue.Replace(",", split);
                    }
                    this.Text = Msg1 + Msg2 + temp;
                }
                if (this._isScroll)
                {
                    this.ProcessScroll();
                }
            }
        }
        /// <summary>
        /// 控件报警信息
        /// </summary>
        public string ControlAlarmValue
        {
            get { return _controlAlarmValue; }
            set 
            {
                if (_controlAlarmValue != value)
                {
                    this._controlAlarmValue = value;
                    Msg2 = string.Empty;
                    int[] values = ParseBinaryValue(_alarmValue2, 16);
                    Msg2 = GetAlarmInfo2(values, 16, _alarmWord2);
                    //this.Text = Msg1 + Msg2;
                    string temp = String.Empty;
                    if (_isMuilt)
                    {
                        temp = String.IsNullOrEmpty(this._controlAlarmValue) ? String.Empty : this._controlAlarmValue.Replace(",", enter);
                    }
                    else
                    {
                        temp = String.IsNullOrEmpty(this._controlAlarmValue) ? String.Empty : this._controlAlarmValue.Replace(",", split);
                    }
                    this.Text = Msg1 + Msg2 + temp;
                }
                if (this._isScroll)
                {
                    this.ProcessScroll();
                }
            }
        }
        /// <summary>
        /// 报警地址字1
        /// </summary>
        public int AlarmWord1
        {
            get { return _alarmWord1; }
            set { _alarmWord1 = value; }
        }
        /// <summary>
        /// 报警地址字2
        /// </summary>
        public int AlarmWord2
        {
            get { return _alarmWord2; }
            set { _alarmWord2 = value; }
        }

        /// <summary>
        /// 是否滚动显示
        /// </summary>
        public bool IsScroll
        {
            get { return _isScroll; }
            set { _isScroll = value; }
        }
        /// <summary>
        /// 是否换行
        /// </summary>
        public bool IsMuilt
        {
            get { return _isMuilt; }
            set { _isMuilt = value; }
        }
        /// <summary>
        /// 滚动步长
        /// </summary>
        public int ScrollStep
        {
            get { return _scrollStep; }
            set { _scrollStep = value; }
        }
        /// <summary>
        /// 报警信息数据源
        /// </summary>
        public DataTable Data
        {
            get { return _data; }
            set
            {
                _data = value;
                //if (_data != null)
                //{
                //    _cloneData = _data;
                //}
                if (this._cloneData == null || this._cloneData.TableName != this._data.TableName)
                {
                    InitData();
                }
            }
        }

        #endregion

        #region 动画属性

        /// <summary>
        /// 报警信息数据源
        /// </summary>
        public string DataName
        {
            get { return _dataName; }
            set { _dataName = value; }
        }

        /// <summary>
        /// 报警变量1
        /// </summary>
        public string AlarmName1
        {
            get { return _alarmName1; }
            set { _alarmName1 = value; }
        }
        /// <summary>
        /// 报警变量2
        /// </summary>
        public string AlarmName2
        {
            get { return _alarmName2; }
            set { _alarmName2 = value; }
        }

        /// <summary>
        /// 控件报警动画属性
        /// </summary>
        public string ControlAlarmName
        {
            get { return _controlAlarmName; }
            set { _controlAlarmName = value; }
        }

        #endregion

        #region 辅助方法

        /// <summary>
        /// 初始化数据
        /// </summary>
        public void InitData()
        {
            if (this._cloneData != null)
            {
                this._cloneData.Dispose();
                this._cloneData = null;
            }

            if (this._data != null)
            {
                this._cloneData = this._data.Copy();
            }
        }


        /// <summary>
        /// 显示报警信息1
        /// </summary>
        /// <param name="values"></param>
        /// <param name="WordLength"></param>
        /// <param name="alarmBlock"></param>
        private string GetAlarmInfo1(int[] values, int WordLength, int alarmBlock)
        {
            string tempMsg1 = String.Empty;
            if (values == null)
                return String.Empty;
            for (int i = 0; i < WordLength; i++)
            {
                if (values[i].ToString() == "1")
                {
                    string info = this.AlarmStr(alarmBlock, i);
                    if (_isMuilt)
                    {
                        //Msg1 = Msg1 + info + enter;
                        tempMsg1 += info + enter;
                    }
                    else
                    {
                        //Msg1 = Msg1 + this.AlarmStr(alarmBlock, i) + split;
                        tempMsg1 += info + split;
                    }
                }
            }
            return tempMsg1;
            //if (_isMuilt)
            //    this.Text = this.Text + Msg1;
            //else
            //{
            //    if (Msg1 != string.Empty)
            //        this.Text = this.Text + Msg1.Substring(0, Msg1.Length - 1);
            //    else
            //        this.Text = this.Text + Msg1;
            //}
        }

        /// <summary>
        /// 显示报警信息2
        /// </summary>
        /// <param name="values"></param>
        /// <param name="WordLength"></param>
        /// <param name="alarmBlock"></param>
        private string GetAlarmInfo2(int[] values, int WordLength, int alarmBlock)
        {
            string tempMsg2 = String.Empty;
            if (values == null)
                return String.Empty;
            for (int i = 0; i < WordLength; i++)
            {
                if (values[i].ToString() == "1")
                {
                    string info = this.AlarmStr(alarmBlock, i);
                    if (_isMuilt)
                    {
                        //Msg2 = Msg2 + info + enter;
                        tempMsg2 += info + enter;
                    }
                    else
                    {
                        //Msg2 = Msg2 + this.AlarmStr(alarmBlock, i) + split;
                        tempMsg2 += info + split;
                    }
                }
            }
            return tempMsg2;
            //if (_isMuilt)
            //    this.Text = this.Text + Msg2;
            //else
            //{
            //    if (Msg2 != string.Empty)
            //        this.Text = this.Text + Msg2.Substring(0, Msg2.Length - 1);
            //    else
            //        this.Text = this.Text + Msg2;

            //}
        }


        /// <summary>
        /// 查找报警信息
        /// </summary>
        /// <param name="alarm_address"></param>
        /// <param name="alarm_bit"></param>
        /// <param name="logFlag"></param>
        private string AlarmStr(int alarm_address, int alarm_bit)
        {
            if (_cloneData == null || _cloneData.Rows.Count == 0)
                return string.Empty;
            if (_cloneData.Select(string.Format("Alarm_address='{0}' and Alarm_bit='{1}'", alarm_address, alarm_bit)).Length==0)
            {
                return string.Empty;
            }
            DataRow[] rows = _cloneData.Select(string.Format("Alarm_address='{0}' and Alarm_bit='{1}'", alarm_address, alarm_bit));
            return rows[0]["Alarm_Name"].ToString(); ;
        }

        /// <summary>
        /// 解析二进制位
        /// </summary>
        /// <param name="x">要解析的变量</param>
        /// <param name="len">解析的长度</param>
        /// <returns>返回解析的二进制值数组</returns>
        private int[] ParseBinaryValue(int x, int len)
        {
            int[] result = new int[len];
            int b = 1;
            for (int i = 0; i < len; i++)
            {
                result[i] = (x & b) == 0 ? 0 : 1;
                b = b << 1;
            }
            return result;
        }

        /// <summary>
        /// 处理滚动的方法
        /// </summary>
        private void ProcessScroll()
        {
            Control parent = this.Parent;
            if (parent != null)
            {
                this.Left -= this._scrollStep;
                if (this.Left < 10)
                {
                    this.Left = parent.Width - 10;
                }
            }
        }

        #endregion
    }
}