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.DAL.Observables; using Tango.MachineStudio.Common.Notifications; using Tango.SharedUI; namespace Tango.MachineStudio.MachineDesigner.ViewModels { public class MainViewVM : ViewModel { private bool _isSaving; private INotificationProvider _notification; private ObservablesEntitiesAdapter _adapter; /// /// Gets or sets the db adapter. /// public ObservablesEntitiesAdapter Adapter { get { return _adapter; } set { _adapter = value; RaisePropertyChangedAuto(); } } private Machine _machine; /// /// Gets or sets the machine. /// public Machine Machine { get { return _machine; } set { _machine = value; RaisePropertyChangedAuto(); } } private Machine _selectedMachine; public Machine SelectedMachine { get { return _selectedMachine; } set { _selectedMachine = value; RaisePropertyChangedAuto(); OnSelectedMachineChanged(); } } private Configuration _configuration; /// /// Gets or sets the configuration. /// public Configuration Configuration { get { return _configuration; } set { _configuration = value; RaisePropertyChangedAuto(); } } private IdsPack _selectedIds; /// /// Gets or sets the selected ids pack. /// public IdsPack SelectedIds { get { return _selectedIds; } set { _selectedIds = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } private ObservableCollection _history; public ObservableCollection History { get { return _history; } set { _history = value; RaisePropertyChangedAuto(); } } private Configuration _selectedHistoryConfiguration; /// /// Gets or sets the selected history configuration. /// public Configuration SelectedHistoryConfiguration { get { return _selectedHistoryConfiguration; } set { _selectedHistoryConfiguration = value; RaisePropertyChangedAuto(); OnHistoryConfigurationSelected(); } } private String _filter; public String Filter { get { return _filter; } set { _filter = value; RaisePropertyChangedAuto(); OnFilterChanged(); } } public RelayCommand SaveCommand { get; set; } public RelayCommand AddIdsCommand { get; set; } public RelayCommand RemoveIdsCommand { get; set; } /// /// Initializes a new instance of the class. /// public MainViewVM(INotificationProvider notification) { _notification = notification; Adapter = ObservablesEntitiesAdapter.Instance; Configuration = new Configuration(); Configuration.Name = "Untitled"; Machine = new Machine(); Machine.Configuration = Configuration; Configuration.ApplicationFirmwareVersions = Adapter.ApplicationFirmwareVersions.First(); SaveCommand = new RelayCommand(Save, (x) => !_isSaving); AddIdsCommand = new RelayCommand(AddIds, (x) => !_isSaving && Configuration.IdsPacks.Count < 8); RemoveIdsCommand = new RelayCommand(RemoveIds, (x) => !_isSaving && SelectedIds != null); } private void OnSelectedMachineChanged() { if (SelectedMachine != null) { Machine = SelectedMachine.CloneEntity(); Configuration = Machine.Configuration.CloneConfiguration(); History = SelectedMachine.MachinesConfigurations.Select(x => x.Configuration).ToObservableCollection(); } else { History = new ObservableCollection(); } } private void OnHistoryConfigurationSelected() { if (SelectedHistoryConfiguration != null) { Configuration = SelectedHistoryConfiguration.CloneConfiguration(); } } public void DropTouchPanel(ApplicationDisplayPanelVersion applicationDisplayPanelVersion) { Configuration.ApplicationDisplayPanelVersions = applicationDisplayPanelVersion; Configuration.ApplicationDisplayPanelVersionGuid = applicationDisplayPanelVersion.Guid; } public void DropApplicationVersion(ApplicationVersion applicationVersion) { Configuration.ApplicationVersions = applicationVersion; Configuration.ApplicationVersionGuid = applicationVersion.Guid; } public void DropHardwareVersion(HardwareVersion hardwareVersion) { Configuration.HardwareVersions = hardwareVersion; Configuration.HardwareVersionGuid = hardwareVersion.Guid; } public void DropEmbeddedFirmware(EmbeddedFirmwareVersion embeddedFirmwareVersion) { Configuration.EmbeddedFirmwareVersions = embeddedFirmwareVersion; Configuration.EmbeddedFirmwareVersionGuid = embeddedFirmwareVersion.Guid; } public void DropEmbeddedSoftware(EmbeddedSoftwareVersion embeddedSoftwareVersion) { Configuration.EmbeddedSoftwareVersions = embeddedSoftwareVersion; Configuration.EmbeddedSoftwareVersionGuid = embeddedSoftwareVersion.Guid; } public void DropApplicationOsVersion(ApplicationOsVersion applicationOsVersion) { Configuration.ApplicationOsVersions = applicationOsVersion; Configuration.ApplicationVersionGuid = applicationOsVersion.Guid; } private void RemoveIds() { Configuration.IdsPacks.Remove(SelectedIds); SelectedIds = null; } private void AddIds() { Configuration.IdsPacks.Add(new IdsPack() { Configuration = Configuration }); InvalidateRelayCommands(); } public void DropCartridgeType(CartridgeType cartridgeType, IdsPack idsPack) { idsPack.CartridgeTypes = cartridgeType; idsPack.CartridgeTypeGuid = cartridgeType.Guid; } public void DropDispenser(Dispenser dispenser, IdsPack idsPack) { idsPack.Dispenser = dispenser; idsPack.DispenserGuid = dispenser.Guid; } public void DropMidTankType(MidTankType midTankType, IdsPack idsPack) { idsPack.MidTankTypes = midTankType; idsPack.MidTankTypeGuid = midTankType.Guid; } public void DropLiquidType(LiquidType liquidType, IdsPack idsPack) { idsPack.LiquidTypes = liquidType; idsPack.LiquidTypeGuid = liquidType.Guid; } private void OnFilterChanged() { List collections = new List(); 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.DispensersViewSource); 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) { return value.ToLower().Contains(Filter.ToLower()); } } return false; }; } } private async void Save() { _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(); Machine = Adapter.Machines.SingleOrDefault(x => x.Guid == Machine.Guid); Configuration = Machine.Configuration.CloneConfiguration(); } } else { foreach (var ids in Configuration.IdsPacks) { ids.Configuration = Configuration; ids.ConfigurationGuid = Configuration.Guid; } 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.Configuration = Configuration; machine.Organization = Machine.Organization; if (add_history) { machine.MachinesConfigurations.Add(new MachinesConfiguration() { Configuration = Configuration, Machine = machine }); } await machine.SaveAsync(); 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(); } } private void SetHistory(Machine machine) { History = machine.MachinesConfigurations.Select(x => x.Configuration).ToObservableCollection(); History.Insert(0, machine.Configuration); } } }