aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadLoadingViewVM.cs
blob: 5c4d003a126a85391e0625eb10fc75819b1c8d5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
using Tango.Core.Commands;
using Tango.Integration.Operation;
using Tango.PMR.ThreadLoading;
using Tango.PPC.Common.Connection;
using Tango.SharedUI;

namespace Tango.PPC.UI.Dialogs
{
    public class ThreadLoadingViewVM : DialogViewVM
    {
        public class ThreadLoadingResult
        {
            public bool IsCompleted { get; set; }
            public Exception FailedException { get; set; }
        }

        private ThreadLoadingConfirmationRequiredEventArgs _confirmationArgs;

        public ThreadLoadingResult Result { get; set; }

        public IMachineProvider MachineProvider { get; set; }

        private StartThreadLoadingResponse _status;
        public StartThreadLoadingResponse Status
        {
            get { return _status; }
            set { _status = value; RaisePropertyChangedAuto(); }
        }

        private bool _isFinalizing;
        public bool IsFinalizing
        {
            get { return _isFinalizing; }
            set { _isFinalizing = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private bool _isPreparing;
        public bool IsPreparing
        {
            get { return _isPreparing; }
            set { _isPreparing = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        public List<Rml> Rmls { get; set; }

        private Rml _selectedRml;
        public Rml SelectedRml
        {
            get { return _selectedRml; }
            set { _selectedRml = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        public RelayCommand ContinueCommand { get; set; }

        public ThreadLoadingViewVM(IMachineProvider machineProvider)
        {
            CanClose = true;
            IsPreparing = true;
            ContinueCommand = new RelayCommand(ContinueThreadLoading, () => !IsFinalizing && SelectedRml != null);
            MachineProvider = machineProvider;
            MachineProvider.MachineOperator.ThreadLoadingStatusChanged += MachineOperator_ThreadLoadingStatusChanged;
            MachineProvider.MachineOperator.ThreadLoadingCompleted += MachineOperator_ThreadLoadingCompleted;
            MachineProvider.MachineOperator.ThreadLoadingFailed += MachineOperator_ThreadLoadingFailed;
            MachineProvider.MachineOperator.ThreadLoadingConfirmationRequired += MachineOperator_ThreadLoadingConfirmationRequired;
        }

        public ThreadLoadingViewVM(IMachineProvider machineProvider, ThreadLoadingConfirmationRequiredEventArgs confirmationArgs) : this(machineProvider)
        {
            _confirmationArgs = confirmationArgs;
            IsPreparing = false;
        }

        private void MachineOperator_ThreadLoadingConfirmationRequired(object sender, ThreadLoadingConfirmationRequiredEventArgs e)
        {
            _confirmationArgs = e;
            IsPreparing = false;
        }

        private async void ContinueThreadLoading()
        {
            IsFinalizing = true;

            try
            {
                await Task.Factory.StartNew(() => { _confirmationArgs.Confirm(SelectedRml.GetActiveProcessGroup().ProcessParametersTables.FirstOrDefault()); });
            }
            catch (Exception ex)
            {
                Result = new ThreadLoadingResult()
                {
                    FailedException = ex,
                };

                IsFinalizing = false;

                if (IsVisible)
                {
                    InvokeUI(() =>
                    {
                        Accept();
                    });
                }
            }
        }

        private void MachineOperator_ThreadLoadingCompleted(object sender, StartThreadLoadingResponse e)
        {
            Result = new ThreadLoadingResult()
            {
                IsCompleted = true
            };

            if (IsVisible)
            {
                InvokeUI(() =>
                {
                    Accept();
                });
            }
        }

        private void MachineOperator_ThreadLoadingFailed(object sender, StartThreadLoadingResponse e)
        {
            Result = new ThreadLoadingResult()
            {
                FailedException = new Exception(e.ErrorReason),
            };

            if (IsVisible)
            {
                InvokeUI(() =>
                {
                    Accept();
                });
            }
        }

        private void MachineOperator_ThreadLoadingStatusChanged(object sender, StartThreadLoadingResponse e)
        {
            Status = e;

            if (Status.State == ThreadLoadingState.Finalizing)
            {
                IsFinalizing = true;
            }
        }

        protected override void Cancel()
        {
            IsFinalizing = false;
            ClearEvents();
            base.Cancel();
        }

        protected override void Accept()
        {
            IsFinalizing = false;
            ClearEvents();
            base.Accept();
        }

        private void ClearEvents()
        {
            MachineProvider.MachineOperator.ThreadLoadingStatusChanged -= MachineOperator_ThreadLoadingStatusChanged;
            MachineProvider.MachineOperator.ThreadLoadingCompleted -= MachineOperator_ThreadLoadingCompleted;
            MachineProvider.MachineOperator.ThreadLoadingFailed -= MachineOperator_ThreadLoadingFailed;
            MachineProvider.MachineOperator.ThreadLoadingConfirmationRequired -= MachineOperator_ThreadLoadingConfirmationRequired;
        }
    }
}