优化更新提示
智能大石头 authored at 2025-05-14 18:40:46
6.36 KiB
XCoder
using System;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
using NewLife.Reflection;
using NewLife.Net;
using System.IO;
using NewLife.Log;
using NewLife.Threading;

namespace XCoder;

public partial class FrmMDI : Form
{
    #region 窗口初始化
    Task<Type[]> _load;

    public FrmMDI()
    {
        _load = Task<Type[]>.Factory.StartNew(() => typeof(IXForm).GetAllSubclasses(true).ToArray());

        InitializeComponent();

        // 动态调节宽度高度,兼容高DPI
        this.FixDpi();

        Icon = Source.GetIcon();
    }

    private void FrmMDI_Shown(Object sender, EventArgs e)
    {
        var set = XConfig.Current;
        if (set.Width > 0 || set.Height > 0)
        {
            Width = set.Width;
            Height = set.Height;
            Top = set.Top;
            Left = set.Left;
        }

        var asm = AssemblyX.Create(Assembly.GetExecutingAssembly());
        if (set.Title.IsNullOrEmpty()) set.Title = asm.Title;
        Text = String.Format("{2} v{0} {1:HH:mm:ss}", asm.CompileVersion, asm.Compile, set.Title);

        _load.ContinueWith(t => LoadForms(t.Result));

        ThreadPoolX.QueueUserWorkItem(() => CheckUpdate(true));
    }

    void LoadForms(Type[] ts)
    {
        var name = XConfig.Current.LastTool + "";
        foreach (var item in ts)
        {
            if (item.FullName.EqualIgnoreCase(name))
            {
                this.Invoke(() => CreateForm(item.CreateInstance() as Form));

                break;
            }
        }

        this.Invoke(() =>
        {
            var root = toolsMenu;
            foreach (var item in ts)
            {
                var mi = root.DropDownItems.Add(item.GetDisplayName() ?? item.FullName);
                mi.Tag = item;
                mi.Click += (s, e) =>
                {
                    var tsi = s as ToolStripItem;
                    var type = tsi.Tag as Type;
                    CreateForm(type.CreateInstance() as Form);
                };
            }
        });
    }

    private void FrmMDI_FormClosing(Object sender, FormClosingEventArgs e)
    {
        var set = XConfig.Current;
        var area = Screen.PrimaryScreen.WorkingArea;
        if (Left >= 0 && Top >= 0 && Width < area.Width - 60 && Height < area.Height - 60)
        {
            set.Width = Width;
            set.Height = Height;
            set.Top = Top;
            set.Left = Left;
            set.Save();
        }
    }
    #endregion

    #region 应用窗口
    void CreateForm<TForm>() where TForm : Form, new()
    {
        var name = typeof(TForm).FullName;
        var cfg = XConfig.Current;
        if (name != cfg.LastTool)
        {
            cfg.LastTool = name;
            cfg.Save();
        }

        var frm = new TForm();
        CreateForm(frm);
    }

    void CreateForm(Form frm)
    {
        var name = frm.GetType().FullName;
        var cfg = XConfig.Current;
        if (name != cfg.LastTool)
        {
            cfg.LastTool = name;
            cfg.Save();
        }

        frm.MdiParent = this;
        frm.WindowState = FormWindowState.Maximized;
        frm.Show();
    }
    #endregion

    #region 菜单控制
    private void ShowNewForm(Object sender, EventArgs e) { }

    private void CascadeToolStripMenuItem_Click(Object sender, EventArgs e) { LayoutMdi(MdiLayout.Cascade); }

    private void TileVerticalToolStripMenuItem_Click(Object sender, EventArgs e) { LayoutMdi(MdiLayout.TileVertical); }

    private void TileHorizontalToolStripMenuItem_Click(Object sender, EventArgs e) { LayoutMdi(MdiLayout.TileHorizontal); }

    private void ArrangeIconsToolStripMenuItem_Click(Object sender, EventArgs e) { LayoutMdi(MdiLayout.ArrangeIcons); }

    private void CloseAllToolStripMenuItem_Click(Object sender, EventArgs e)
    {
        foreach (var childForm in MdiChildren)
        {
            childForm.Close();
        }
    }

    private void aboutToolStripMenuItem_Click(Object sender, EventArgs e)
    {
        Process.Start("http://www.NewLifeX.com");
    }
    #endregion

    #region 自动更新
    private void 检查更新ToolStripMenuItem_Click(Object sender, EventArgs e)
    {
        ThreadPoolX.QueueUserWorkItem(() => CheckUpdate(false));
    }

    private void CheckUpdate(Boolean auto)
    {
        if (auto) XTrace.WriteLine("自动更新!");

        var up = new Upgrade
        {
            Log = XTrace.Log,
            Name = "XCoder"
        };
        up.DeleteBackup(".");

        // 旧版本升级到当前版本时,再次启动时,自动更新到最新版本
        var cfg = XConfig.Current;
        if (cfg.LastUpdate.Date < DateTime.Today || cfg.LastUpdate.AddMinutes(5) > DateTime.Now || !auto)
        {
            cfg.LastUpdate = DateTime.Now;
            cfg.Save();

            // 为了把XCoder升级引导到新的升级机制,让搜索下载站的/XCoder/目录,根目录则放置v6.9修正升级包,为了让v6.9和v7.*成功升级
            var uri = new Uri(cfg.UpdateServer);
            if (uri.AbsolutePath.IsNullOrEmpty() || uri.AbsolutePath == "/")
                up.Server = cfg.UpdateServer + "XCoder";
            else
                up.Server = cfg.UpdateServer;

            var root = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            up.UpdatePath = root.CombinePath(up.UpdatePath);
            if (up.Check())
            {
                up.Download();
                if (!auto || MessageBox.Show("发现新版本{0},是否更新?".F(up.Link.Version), "自动更新", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    var flag = up.Update();
                    MessageBox.Show("更新" + (flag ? "成功" : "失败"), "自动更新");

                    Process.Start("XCoder.exe");
                    Application.Exit();
                }
            }
            else if (!auto)
            {
                if (up.Link != null)
                    MessageBox.Show("没有可用更新!最新{0}".F(up.Link.Time), "自动更新");
                else
                    MessageBox.Show("没有可用更新!", "自动更新");
            }
        }
    }
    #endregion
}