aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
blob: 3a0191be4fd84f01bedd43c0035c33db5bd265d0 (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
2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Logging;
using Tango.MachineStudio.Common.Navigation;
using Tango.MachineStudio.Developer.Views;

namespace Tango.MachineStudio.Developer.Navigation
{
    public class DeveloperNavigationManager
    {
        private LogManager LogManager = LogManager.Default;

        public void NavigateTo(DeveloperNavigationView view)
        {
            LogManager.Log(String.Format("Navigating to view {0}...", view.ToString()));
            MainView.Instance.NavigationControl.NavigateTo(view.ToString());
        }
    }
}
ef='#n290'>290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
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));
                    }

                    pack.IsEmpty = false;
                }
                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
    }
}