aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting/GlobalObject.cs
Commit message (Expand)AuthorAgeFilesLines
* MERGERoy Ben Shabat2019-04-091-0/+21
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using Tango.Core.Commands;
using Tango.Core.Helpers;
using Tango.BL.Entities;
using Tango.MachineStudio.Common.Notifications;
using Tango.SharedUI;
using SimpleValidator.Extensions;
using Tango.MachineStudio.Common.StudioApplication;
using Tango.MachineStudio.Common;
using Tango.BL;

namespace Tango.MachineStudio.MachineDesigner.ViewModels
{
    public class MainViewVM : StudioViewModel<MachineDesignerModule>
    {
        private bool _isSaving;
        private INotificationProvider _notification;


        #region Properties

        private ObservablesEntitiesAdapter _adapter;
        /// <summary>
        /// Gets or sets the db adapter.
        /// </summary>
        public ObservablesEntitiesAdapter Adapter
        {
            get { return _adapter; }
            set { _adapter = value; RaisePropertyChangedAuto(); }
        }

        private Machine _machine;
        /// <summary>
        /// Gets or sets the current editable machine.
        /// </summary>
        public Machine Machine
        {
            get { return _machine; }
            set { _machine = value; RaisePropertyChangedAuto(); }
        }

        private Machine _selectedMachine;
        /// <summary>
        /// Gets or sets the selected machine from the drop down.
        /// </summary>
        public Machine SelectedMachine
        {
            get { return _selectedMachine; }
            set { _selectedMachine = value; RaisePropertyChangedAuto(); OnSelectedMachineChanged(); }
        }

        private Configuration _configuration;
        /// <summary>
        /// Gets or sets the editable machine configuration.
        /// </summary>
        public Configuration Configuration
        {
            get { return _configuration; }
            set { _configuration = value; RaisePropertyChangedAuto(); }
        }

        private IdsPack _selectedIds;
        /// <summary>
        /// Gets or sets the selected ids pack.
        /// </summary>
        public IdsPack SelectedIds
        {
            get { return _selectedIds; }
            set { _selectedIds = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private ObservableCollection<Configuration> _history;
        /// <summary>
        /// Gets or sets the machine configuration history.
        /// </summary>
        public ObservableCollection<Configuration> History
        {
            get { return _history; }
            set { _history = value; RaisePropertyChangedAuto(); }
        }

        private Configuration _selectedHistoryConfiguration;
        /// <summary>
        /// Gets or sets the machine selected configuration from history.
        /// </summary>
        public Configuration SelectedHistoryConfiguration
        {
            get { return _selectedHistoryConfiguration; }
            set { _selectedHistoryConfiguration = value; RaisePropertyChangedAuto(); OnHistoryConfigurationSelected(); }
        }

        private String _filter;
        /// <summary>
        /// Gets or sets the configuration components filter.
        /// </summary>
        public String Filter
        {
            get { return _filter; }
            set { _filter = value; RaisePropertyChangedAuto(); OnFilterChanged(); }
        }

        #endregion

        #region Commands

        /// <summary>
        /// Gets or sets the save command.
        /// </summary>
        public RelayCommand SaveCommand { get; set; }

        /// <summary>
        /// Gets or sets the add ids command.
        /// </summary>
        public RelayCommand AddIdsCommand { get; set; }

        /// <summary>
        /// Gets or sets the remove ids command.
        /// </summary>
        public RelayCommand RemoveIdsCommand { get; set; }

        /// <summary>
        /// Gets or sets the set version configuration command.
        /// </summary>
        public RelayCommand SetVersionConfigurationCommand { get; set; }

        /// <summary>
        /// Gets or sets the set as default command.
        /// </summary>
        public RelayCommand SetAsDefaultCommand { get; set; }

        #endregion

        #region Constructors

        public MainViewVM()
        {

        }

        /// <summary>
        /// Initializes a new instance of the <see cref="MainViewVM"/> class.
        /// </summary>
        public MainViewVM(INotificationProvider notification)
        {
            _notification = notification;

            Adapter = ObservablesEntitiesAdapter.Instance;
            Configuration = new Configuration();
            Configuration.Name = "Untitled";
            Machine = new Machine();
            Machine.Configuration = Configuration;

            SaveCommand = new RelayCommand(Save, (x) => !_isSaving);
            AddIdsCommand = new RelayCommand(AddIds, (x) => !_isSaving && Configuration.IdsPacks.Count < 8);
            RemoveIdsCommand = new RelayCommand(RemoveIds, (x) => !_isSaving && SelectedIds != null);
            SetVersionConfigurationCommand = new RelayCommand(SetVersionConfiguration, (x) => !_isSaving);
            SetAsDefaultCommand = new RelayCommand(SetAsDefaultConfiguration, (x) => !_isSaving);
        }

        #endregion

        #region Virtual Methods

        /// <summary>
        /// Called when the selected machine has changed.
        /// </summary>
        protected virtual void OnSelectedMachineChanged()
        {
            if (SelectedMachine != null)
            {
                Machine = SelectedMachine.CloneEntity();
                Configuration = Machine.Configuration.CloneConfiguration();
                History = SelectedMachine.MachinesConfigurations.Select(x => x.Configuration).ToObservableCollection();
            }
            else
            {
                History = new ObservableCollection<Configuration>();
            }
        }

        /// <summary>
        /// Called when the history configuration has been selected
        /// </summary>
        protected virtual void OnHistoryConfigurationSelected()
        {
            if (SelectedHistoryConfiguration != null)
            {
                Configuration = SelectedHistoryConfiguration.CloneConfiguration();
            }
        }

        /// <summary>
        /// Called when the filter has changed
        /// </summary>
        protected virtual void OnFilterChanged()
        {


            List<ICollectionView> collections = new List<ICollectionView>();
            collections.Add(Adapter.ApplicationDisplayPanelVersionsViewSource);
            collections.Add(Adapter.ApplicationVersionsViewSource);
            collections.Add(Adapter.EmbeddedSoftwareVersionsViewSource);
            collections.Add(Adapter.EmbeddedFirmwareVersionsViewSource);
            collections.Add(Adapter.ApplicationOsVersionsViewSource);
            collections.Add(Adapter.ApplicationVersionsViewSource);
            collections.Add(Adapter.DispenserTypesViewSource);
            collections.Add(Adapter.CartridgeTypesViewSource);
            collections.Add(Adapter.LiquidTypesViewSource);
            collections.Add(Adapter.MidTankTypesViewSource);
            collections.Add(Adapter.HardwareVersionsViewSource);

            foreach (var collection in collections)
            {
                collection.Filter = (x) =>
                {
                    foreach (var prop in x.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(y => y.PropertyType == typeof(String)))
                    {
                        String value = prop.GetValue(x).ToStringSafe();

                        if (value != null)
                        {
                            if (value.ToLower().Contains(Filter.ToLower()))
                            {
                                return true;
                            }
                        }
                    }

                    return false;
                };
            }
        }

        #endregion

        #region Drag Drop Handlers

        /// <summary>
        /// Drops the ids pack.
        /// </summary>
        /// <param name="idsPack1">The ids pack1.</param>
        /// <param name="idsPack2">The ids pack2.</param>
        public void DropIdsPack(IdsPack idsPack1, IdsPack idsPack2)
        {
            Configuration.IdsPacks.Swap(idsPack1, idsPack2);
        }

        /// <summary>
        /// Drops the touch panel.
        /// </summary>
        /// <param name="applicationDisplayPanelVersion">The application display panel version.</param>
        public void DropTouchPanel(ApplicationDisplayPanelVersion applicationDisplayPanelVersion)
        {
            Configuration.ApplicationDisplayPanelVersion = applicationDisplayPanelVersion;
            Configuration.ApplicationDisplayPanelVersionGuid = applicationDisplayPanelVersion.Guid;
        }

        /// <summary>
        /// Drops the application firmware version.
        /// </summary>
        /// <param name="applicationFirmwareVersion">The application firmware version.</param>
        public void DropApplicationFirmwareVersion(ApplicationFirmwareVersion applicationFirmwareVersion)
        {
            Configuration.ApplicationFirmwareVersion = applicationFirmwareVersion;
            Configuration.ApplicationFirmwareVersionGuid = applicationFirmwareVersion.Guid;
        }

        /// <summary>
        /// Drops the application version.
        /// </summary>
        /// <param name="applicationVersion">The application version.</param>
        public void DropApplicationVersion(ApplicationVersion applicationVersion)
        {
            Configuration.ApplicationVersion = applicationVersion;
            Configuration.ApplicationVersionGuid = applicationVersion.Guid;
        }

        /// <summary>
        /// Drops the hardware version.
        /// </summary>
        /// <param name="hardwareVersion">The hardware version.</param>
        public void DropHardwareVersion(HardwareVersion hardwareVersion)
        {
            Configuration.HardwareVersion = hardwareVersion;
            Configuration.HardwareVersionGuid = hardwareVersion.Guid;
        }

        /// <summary>
        /// Drops the embedded firmware.
        /// </summary>
        /// <param name="embeddedFirmwareVersion">The embedded firmware version.</param>
        public void DropEmbeddedFirmware(EmbeddedFirmwareVersion embeddedFirmwareVersion)
        {
            Configuration.EmbeddedFirmwareVersion = embeddedFirmwareVersion;
            Configuration.EmbeddedFirmwareVersionGuid = embeddedFirmwareVersion.Guid;
        }

        /// <summary>
        /// Drops the embedded software.
        /// </summary>
        /// <param name="embeddedSoftwareVersion">The embedded software version.</param>
        public void DropEmbeddedSoftware(EmbeddedSoftwareVersion embeddedSoftwareVersion)
        {
            Configuration.EmbeddedSoftwareVersion = embeddedSoftwareVersion;
            Configuration.EmbeddedSoftwareVersionGuid = embeddedSoftwareVersion.Guid;
        }

        /// <summary>
        /// Drops the application os version.
        /// </summary>
        /// <param name="applicationOsVersion">The application os version.</param>
        public void DropApplicationOsVersion(ApplicationOsVersion applicationOsVersion)
        {
            Configuration.ApplicationOsVersion = applicationOsVersion;
            Configuration.ApplicationVersionGuid = applicationOsVersion.Guid;
        }

        /// <summary>
        /// Drops the type of the cartridge.
        /// </summary>
        /// <param name="cartridgeType">Type of the cartridge.</param>
        /// <param name="idsPack">The ids pack.</param>
        public void DropCartridgeType(CartridgeType cartridgeType, IdsPack idsPack)
        {
            idsPack.CartridgeType = cartridgeType;
            idsPack.CartridgeTypeGuid = cartridgeType.Guid;
        }

        /// <summary>
        /// Drops the dispenser.
        /// </summary>
        /// <param name="dispenserType">The dispenser.</param>
        /// <param name="idsPack">The ids pack.</param>
        public void DropDispenserType(DispenserType dispenserType, IdsPack idsPack)
        {
            idsPack.DispenserType = dispenserType;
            idsPack.DispenserTypeGuid = dispenserType.Guid;
        }

        /// <summary>
        /// Drops the type of the mid tank.
        /// </summary>
        /// <param name="midTankType">Type of the mid tank.</param>
        /// <param name="idsPack">The ids pack.</param>
        public void DropMidTankType(MidTankType midTankType, IdsPack idsPack)
        {
            idsPack.MidTankType = midTankType;
            idsPack.MidTankTypeGuid = midTankType.Guid;
        }

        /// <summary>
        /// Drops the type of the liquid.
        /// </summary>
        /// <param name="liquidType">Type of the liquid.</param>
        /// <param name="idsPack">The ids pack.</param>
        public void DropLiquidType(LiquidType liquidType, IdsPack idsPack)
        {
            idsPack.LiquidType = liquidType;
            idsPack.LiquidTypeGuid = liquidType.Guid;
        }

        /// <summary>
        /// Drops the ids formula.
        /// </summary>
        /// <param name="idsPackFormula">The ids pack formula.</param>
        /// <param name="idsPack">The ids pack.</param>
        /// <exception cref="NotImplementedException"></exception>
        public void DropIdsFormula(IdsPackFormula idsPackFormula, IdsPack idsPack)
        {
            idsPack.IdsPackFormula = idsPackFormula;
            idsPack.IdsPackFormulaGuid = idsPackFormula.Guid;
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Removes the selected IDS pack.
        /// </summary>
        private void RemoveIds()
        {
            Configuration.IdsPacks.Remove(SelectedIds);
            SelectedIds = null;
        }

        /// <summary>
        /// Adds a new IDS pack.
        /// </summary>
        private void AddIds()
        {
            Configuration.IdsPacks.Add(new IdsPack() { Configuration = Configuration });
            InvalidateRelayCommands();
        }

        /// <summary>
        /// Saves the current machine configuration.
        /// </summary>
        private async void Save()
        {
            foreach (var ids in Configuration.IdsPacks)
            {
                ids.PackIndex = Configuration.IdsPacks.IndexOf(ids);
                ids.Configuration = Configuration;
                ids.ConfigurationGuid = Configuration.Guid;
            }

            //Validate

            List<String> errors = new List<string>();

            if (Machine.MachineVersion == null)
            {
                errors.Add("Machine version is required.");
            }

            if (Machine.Name.IsNullOrWhiteSpace())
            {
                errors.Add("Machine name is required.");
            }

            if (Machine.Organization == null)
            {
                errors.Add("Machine organization is required.");
            }

            if (Machine.SerialNumber.IsNullOrWhiteSpace())
            {
                errors.Add("Machine serial number is required.");
            }

            if (Configuration.Name.IsNullOrWhiteSpace())
            {
                errors.Add("Configuration name is required.");
            }

            if (Configuration.ApplicationDisplayPanelVersion == null)
            {
                errors.Add("Touch Panel is required.");
            }

            if (Configuration.ApplicationFirmwareVersion == null)
            {
                errors.Add("Application firmware is required.");
            }

            if (Configuration.ApplicationOsVersion == null)
            {
                errors.Add("Application operation system is required.");
            }

            if (Configuration.ApplicationVersion == null)
            {
                errors.Add("Application version is required.");
            }

            if (Configuration.EmbeddedFirmwareVersion == null)
            {
                errors.Add("Embedded firmware is required.");
            }

            if (Configuration.EmbeddedSoftwareVersion == null)
            {
                errors.Add("Embedded software is required.");
            }

            if (Configuration.HardwareVersion == null)
            {
                errors.Add("Hardware version is required.");
            }

            foreach (var pack in Configuration.IdsPacks)
            {
                if (pack.LiquidType != null || pack.CartridgeType != null || pack.DispenserType != null || pack.IdsPackFormula != null || pack.MidTankType != null)
                {
                    if (pack.Name.IsNullOrWhiteSpace())
                    {
                        errors.Add(String.Format("Name is required on IDS pack number '{0}'.", Configuration.IdsPacks.IndexOf(pack) + 1));
                        continue;
                    }
                    if (pack.CartridgeType == null)
                    {
                        errors.Add(String.Format("Cartridge type is required on IDS pack '{0}'.", pack.Name));
                    }
                    if (pack.DispenserType == null)
                    {
                        errors.Add(String.Format("Dispenser type is required on IDS pack '{0}'.", pack.Name));
                    }
                    if (pack.LiquidType == null)
                    {
                        errors.Add(String.Format("Liquid type is required on IDS pack '{0}'.", pack.Name));
                    }
                    if (pack.MidTankType == null)
                    {
                        errors.Add(String.Format("Mid Tank type is required on IDS pack '{0}'.", pack.Name));
                    }
                    if (pack.IdsPackFormula == null)
                    {
                        errors.Add(String.Format("Formula type is required on IDS pack '{0}'.", pack.Name));
                    }
                }
                else
                {
                    pack.IsEmpty = true;
                    pack.Name = String.Empty;
                }
            }

            if (errors.Count > 0)
            {
                String errorsString = "Please fix the following validation errors before trying to save." + Environment.NewLine + Environment.NewLine;
                errorsString += String.Join(Environment.NewLine, errors);
                _notification.ShowError(errorsString);
                return;
            }

            //Validate

            _isSaving = true;
            InvalidateRelayCommands();

            try
            {
                using (_notification.PushTaskItem("Saving Machine Configuration..."))
                {
                    if (!Adapter.Machines.ToList().Exists(x => x.SerialNumber.ToLower() == Machine.SerialNumber.ToLower()))
                    {
                        if (!_notification.ShowQuestion("The specified machine serial number does not exist. Do you wish to create a new machine?"))
                        {
                            return;
                        }
                        else
                        {
                            Machine.Configuration = Configuration;
                            Configuration.CreationDate = DateTime.UtcNow;
                            Machine.ProductionDate = DateTime.UtcNow;
                            Machine.MachinesConfigurations.Add(new MachinesConfiguration()
                            {
                                Configuration = Configuration,
                                Machine = Machine,
                            });
                            await Machine.SaveAsync(Adapter.Context);

                            Machine = Adapter.Machines.SingleOrDefault(x => x.Guid == Machine.Guid);
                            Configuration = Machine.Configuration.CloneConfiguration();
                        }
                    }
                    else
                    {
                        var machine = Adapter.Machines.Single(x => x.SerialNumber.ToLower() == Machine.SerialNumber.ToLower());

                        //Set 'Real machine' parameters...

                        bool add_history = History.Count == 0 || History.First().Name != Configuration.Name;

                        machine.Name = Machine.Name;
                        machine.SerialNumber = Machine.SerialNumber;
                        machine.Organization = Machine.Organization;


                        if (add_history)
                        {
                            machine.MachinesConfigurations.Add(new MachinesConfiguration()
                            {
                                Configuration = Configuration,
                                Machine = machine
                            });
                        }
                        else
                        {
                            machine.Configuration.DefferedDelete(Adapter.Context);
                        }

                        machine.Configuration = Configuration;

                        await machine.SaveAsync(Adapter.Context);

                        Machine = Adapter.Machines.SingleOrDefault(x => x.Guid == machine.Guid);
                        Configuration = Machine.Configuration.CloneConfiguration();
                    }

                    SetHistory(Machine);
                    Machine = Machine.CloneEntity();
                }
            }
            catch (Exception ex)
            {
                _notification.ShowError("An error occurred while trying to save the configuration" + Environment.NewLine + ex.Message);
            }
            finally
            {
                _isSaving = false;
                InvalidateRelayCommands();
            }
        }

        /// <summary>
        /// Sets the specified machine history.
        /// </summary>
        /// <param name="machine">The machine.</param>
        private void SetHistory(Machine machine)
        {
            History = machine.MachinesConfigurations.Select(x => x.Configuration).ToObservableCollection();
            History.Insert(0, machine.Configuration);
        }

        /// <summary>
        /// Sets the current configuration to the selected machine version default configuration.
        /// </summary>
        private void SetVersionConfiguration()
        {
            if (Machine.MachineVersion != null)
            {
                Configuration = Machine.MachineVersion.DefaultConfiguration.CloneConfiguration();
            }
            else
            {
                _notification.ShowError("No machine version selected.");
            }
        }

        /// <summary>
        /// Sets the current configuration as a default machine version configuration.
        /// </summary>
        private void SetAsDefaultConfiguration()
        {
            _notification.ShowModalDialog<MachineVersionDialogVM>(async (vm) =>
            {
                try
                {
                    using (_notification.PushTaskItem("Saving Default Configuration..."))
                    {
                        if (vm.SelectedVersion != null)
                        {
                            vm.SelectedVersion.DefaultConfiguration = Configuration.CloneConfiguration();
                            vm.SelectedVersion.DefaultConfigurationGuid = vm.SelectedVersion.DefaultConfiguration.Guid;
                            await vm.SelectedVersion.SaveAsync(Adapter.Context);
                        }
                        else
                        {
                            MachineVersion newVersion = new MachineVersion();
                            newVersion.Version = vm.Version;
                            newVersion.Name = vm.VersionName;

                            newVersion.DefaultConfiguration = Configuration.CloneConfiguration();
                            newVersion.DefaultConfigurationGuid = newVersion.DefaultConfiguration.Guid;
                            await newVersion.SaveAsync(Adapter.Context);
                        }
                    }
                }
                catch (Exception ex)
                {
                    _notification.ShowError(ex.Message);
                }

            }, () =>
            {

            });
        }

        #endregion

        #region IStudioModuleVM

        public override void OnModuleRequest(params object[] args)
        {
            SelectedMachine = Adapter.Machines.SingleOrDefault(x => x.Guid == (args[0] as Machine).Guid);
        }

        #endregion
    }
}