using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Urovo;
using Microsoft.WindowsCE.Forms;
namespace NetworkDemo
{
    public partial class Form1 : Form
    {
        public enum NetImageType
        {
            NoConnect = 0,
            Connecting = 1,
            WlanConnected = 2,
            GprsConnected = 3
        }
        public enum SignalImageType
        {
            None = 0,
            Low = 1,
            Normal = 2,
            Good = 3,
            Strong = 4,
        }
        public enum BatteryImageType
        {
            Danger = 0,
            Low = 1,
            Normal = 2,
            Good = 3,
            Full = 4,
            AC = 5
        }
        NetworkManager networkMgr = new NetworkManager();
        public NetworkManager NetworkMgr
        {
            get { return networkMgr; }
            set { networkMgr = value; }
        }
        PowerManager powerMgr = new PowerManager();
        public PowerManager PowerMgr
        {
            get { return powerMgr; }
            set { powerMgr = value; }
        }
        private int signalCount = 0;     //取信号计数器
        private DateTime lastAlertTime = DateTime.Now;
        private string JianPanInput = "42429667-ae04-11d0-a4f8-00aa00a749b9";
        public Form1()
        {
            InitializeComponent();
            networkMgr.ConnectNotify += new ConnectNotifyEventHandler(ConnectNotify);
            powerMgr.PowerNotify += new PowerNotifyEventHandler(PowerNotify);
            batteryStatus.BackgroundImage = Properties.Resources.battery;
            netStatus.BackgroundImage = Properties.Resources.net;
            signalStatus.BackgroundImage = Properties.Resources.signal;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                CreateIMEMenu();
                timer1.Enabled = true;
                NetworkManager.ConnectType = rbGprs.Checked ? ConnType.Gprs : ConnType.Wlan;
                this.lblNetType.Text = rbGprs.Checked ? "GPRS" : "WIFI";
                networkMgr.Start();
                powerMgr.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show("程序启动失败!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            //26秒取一次信号
            #region
            if (++signalCount % 26 == 0)
            {
                signalCount = 0;
                SignalImageType signalImageType = SignalImageType.None;
                if (NetworkManager.ConnectType == ConnType.Gprs)
                {
                    if (Device.GetGsmPowerStatus() == 1)
                    {
                        int iStrength = Device.GetGsmSignalStrength();
                        this.lblSignalStrength.Text = iStrength.ToString();
                        if (iStrength == 99 || iStrength == 0)
                        {
                            signalImageType = SignalImageType.None;
                        }
                        else if (iStrength > 21)
                        {
                            signalImageType = SignalImageType.Strong;
                        }
                        else if (iStrength > 16)
                        {
                            signalImageType = SignalImageType.Good;
                        }
                        else if (iStrength > 11)
                        {
                            signalImageType = SignalImageType.Normal;
                        }
                        else
                        {
                            signalImageType = SignalImageType.Low;
                        }
                    }
                    else
                    {
                        lblSignalStrength.Text = "无";
                    }
                }
                else if (NetworkManager.ConnectType == ConnType.Wlan)
                {
                    if (Device.GetWlanPowerStatus() == 1)
                    {
                        int iStrength = Device.GetWlanSignalStrength();
                        this.lblSignalStrength.Text = iStrength.ToString();
                        if (iStrength == 0)
                        {
                            signalImageType = SignalImageType.None;
                        }
                        else if (iStrength >= -57)
                        {
                            signalImageType = SignalImageType.Strong;
                        }
                        else if (iStrength >= -70)
                        {
                            signalImageType = SignalImageType.Good;
                        }
                        else if (iStrength >= -81)
                        {
                            signalImageType = SignalImageType.Normal;
                        }
                        else if (iStrength >= -91)
                        {
                            signalImageType = SignalImageType.Low;
                        }
                    }
                    else
                    {
                        lblSignalStrength.Text = "无";
                    }
                }
                this.signalStatus.ImageIndex = (int)signalImageType;
            }
            #endregion
        }
        #region 网络状态检查
        /// 
        /// 检查网络连接和传输数据
        /// 
        /// 
        /// 
        public void ConnectNotify(object sender, ConnectNotifyEventArgs e)
        {
            if (this.InvokeRequired)
            {
                object[] param = new object[2] { sender, e };
                this.BeginInvoke(new ConnectNotifyEventHandler(OnConnectNotify), param);
            }
            else
            {
                OnConnectNotify(sender, e);
            }
        }
        /// 
        /// 检查网络连接和传输数据
        /// 
        /// 
        /// 
        private void OnConnectNotify(object sender, ConnectNotifyEventArgs e)
        {
            try
            {
                #region Signal
                NetImageType netImageType = NetImageType.NoConnect;
                switch (e.ConnectResult)
                {
                    case ConnState.ConnectSuccess:
                        {
                            switch (e.ConnectType)
                            {
                                case ConnType.Gprs:
                                    netImageType = NetImageType.GprsConnected;
                                    lblNetStatus.Text = "已连接";
                                    break;
                                case ConnType.Wlan:
                                    netImageType = NetImageType.WlanConnected;
                                    lblNetStatus.Text = "已连接";
                                    break;
                                default:
                                    netImageType = NetImageType.NoConnect;
                                    lblNetStatus.Text = "未连接";
                                    break;
                            }
                        }
                        break;
                    case ConnState.Connecting:
                        netImageType = NetImageType.Connecting;
                        lblNetStatus.Text = "正在连接...";
                        break;
                    case ConnState.Disconnectiong:
                        netImageType = NetImageType.Connecting;
                        lblNetStatus.Text = "正在断开连接...";
                        break;
                    default:
                        netImageType = NetImageType.NoConnect;
                        lblNetStatus.Text = "未连接";
                        break;
                }
                this.netStatus.ImageIndex = (int)netImageType;
                #endregion
            }
            catch (Exception ex)
            {
            }
        }
        #endregion
        #region 电源状态
        void PowerNotify(object sender, PowerNotifyEventArgs e)
        {
            if (this.InvokeRequired)
            {
                object[] param = new object[2] { sender, e };
                this.BeginInvoke(new PowerNotifyEventHandler(OnPowerNotify), param);
            }
            else
            {
                OnPowerNotify(sender, e);
            }
        }
        void OnPowerNotify(object sender, PowerNotifyEventArgs e)
        {
            if (e.ACLineStatus != 0x01)
            {
                if (e.BatteryLifePercent <= 7)
                {
                    if (DateTime.Now - lastAlertTime > new TimeSpan(60 * 10))
                    {
                        lastAlertTime = DateTime.MaxValue;
                        MessageBox.Show("电量太低,请注意换电池", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                        Application.DoEvents();
                        lastAlertTime = DateTime.Now;
                    }
                }
            }
            BatteryImageType batteryImageType = BatteryImageType.Danger;
            if (e.ACLineStatus == 0x01)
            {
                batteryImageType = BatteryImageType.AC;
            }
            else if (e.BatteryLifePercent > 80)
            {
                batteryImageType = BatteryImageType.Full;
            }
            else if (e.BatteryLifePercent > 60)
            {
                batteryImageType = BatteryImageType.Good;
            }
            else if (e.BatteryLifePercent > 40)
            {
                batteryImageType = BatteryImageType.Normal;
            }
            else if (e.BatteryLifePercent > 20)
            {
                batteryImageType = BatteryImageType.Low;
            }
            this.batteryStatus.ImageIndex = (int)batteryImageType;
        }
        #endregion
        private void Form1_Closed(object sender, EventArgs e)
        {
            try
            {
                networkMgr.Stop();
                powerMgr.Stop();
            }
            catch (Exception ex)
            {
            }
        }
        private void btnNetChange_Click(object sender, EventArgs e)
        {
            if (rbGprs.Checked)
            {
                networkMgr.Connect(ConnType.Gprs);
                this.lblNetType.Text = "GPRS";
            }
            else
            {
                networkMgr.Connect(ConnType.Wlan);
                this.lblNetType.Text = "WIFI";
            }
        }
        private void gbtnCloseNetwork_Click(object sender, EventArgs e)
        {
            networkMgr.Disconnect();
        }
        private void picClose_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Exit?[Y/N]", "Tip", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
            {
                this.Close();
            }
        }
        private void imageButton1_Click(object sender, EventArgs e)
        {
            this.contextMenu1.Show(this.imageButton1, new Point(-100, -80));
        }
        private void IMEMenu_Click(object sender,EventArgs e)
        {
            try
            {
                MenuItem item = (MenuItem)sender;
                if (item.Text == "隐藏输入面板")
                {
                    this.inputPanel1.Enabled = false;
                }
                else
                {
                    foreach (InputMethod im in inputPanel1.InputMethods)
                    {
                        if (im.Name == item.Text)
                        {
                            inputPanel1.CurrentInputMethod = im;
                        }
                    }
                    inputPanel1.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("软键盘出现错误,详细情况请参阅日志!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
            }
        }
        private void CreateIMEMenu()
        {
            MenuItem item;
            foreach (InputMethod im in this.inputPanel1.InputMethods)
            {
                item = new MenuItem();
                item.Text = im.Name;
                item.Click += new EventHandler(IMEMenu_Click);
                this.contextMenu1.MenuItems.Add(item);
            }
            item = new MenuItem();
            item.Text = "-";
            contextMenu1.MenuItems.Add(item);
            item = new MenuItem();
            item.Text = "隐藏输入面板";
            item.Click += new EventHandler(IMEMenu_Click);
            contextMenu1.MenuItems.Add(item);
        }
        public void EnableInputMethod()
        {
            try
            {
                foreach (InputMethod im in this.inputPanel1.InputMethods)
                {
                    string clsid = im.Clsid.ToString();
                    if (im.Clsid.ToString() == JianPanInput)
                    {
                        this.inputPanel1.CurrentInputMethod = im;
                        this.inputPanel1.Enabled = true;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F2:
                    {
                        EnableInputMethod();
                    }
                    break;
            }
        }
    }
}