Last-Modified: Tue, 30 Jun 2026 08:43:44 GMT Expires: Fri, 27 Jun 2036 08:43:44 GMT Tango - Twine softwares
aboutsummaryrefslogtreecommitdiffstats
path: root/Software/.metadata/.plugins/org.eclipse.core.resources/.history/20/6004d0bc1f5d001a1fca8c4e9db0833f
diff options
context:
space:
mode:
Diffstat (limited to 'Software/.metadata/.plugins/org.eclipse.core.resources/.history/20/6004d0bc1f5d001a1fca8c4e9db0833f')
-rw-r--r--Software/.metadata/.plugins/org.eclipse.core.resources/.history/20/6004d0bc1f5d001a1fca8c4e9db0833f36
1 files changed, 36 insertions, 0 deletions
diff --git a/Software/.metadata/.plugins/org.eclipse.core.resources/.history/20/6004d0bc1f5d001a1fca8c4e9db0833f b/Software/.metadata/.plugins/org.eclipse.core.resources/.history/20/6004d0bc1f5d001a1fca8c4e9db0833f
new file mode 100644
index 000000000..94a2fa3e9
--- /dev/null
+++ b/Software/.metadata/.plugins/org.eclipse.core.resources/.history/20/6004d0bc1f5d001a1fca8c4e9db0833f
@@ -0,0 +1,36 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+SHELL = cmd.exe
+
+# Each subdirectory must supply rules for building sources it contributes
+Modules/Heaters/Heaters_bit.obj: ../Modules/Heaters/Heaters_bit.c $(GEN_OPTS) | $(GEN_HDRS)
+ @echo 'Building file: $<'
+ @echo 'Invoking: ARM Compiler'
+ "C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 -me -Ooff --opt_for_speed=0 --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common/protobuf-c" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics" --include_path="C:/Tango/Software/Embedded_SW/Embedded" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Hardware" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Printing" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Debugging" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Modules" --include_path="C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/include" --include_path="C:/ti/TivaWare_C_Series-2.1.2.111" --include_path="C:/ti/xdctools_3_32_00_06_core/include" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/TivaWare_C_Series-2.1.1.71b" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/bios_6_45_01_29/packages/ti/sysbios/posix" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/tidrivers_tivac_2_16_00_08" --define=ENABLE_LFN --define=TARGET_IS_TM4C129_RA0 --define=ccs="ccs" --define=ccs --define=TIVAWARE --define=PART_TM4C129XNCZAD -g --gcc --diag_suppress=190 --diag_warning=225 --diag_warning=255 --diag_wrap=off --display_error_number --embedded_constants=off --abi=eabi --preproc_with_compile --preproc_dependency="Modules/Heaters/Heaters_bit.d_raw" --obj_directory="Modules/Heaters" $(GEN_OPTS__FLAG) "$<"
+ @echo 'Finished building: $<'
+ @echo ' '
+
+Modules/Heaters/Heaters_init.obj: ../Modules/Heaters/Heaters_init.c $(GEN_OPTS) | $(GEN_HDRS)
+ @echo 'Building file: $<'
+ @echo 'Invoking: ARM Compiler'
+ "C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 -me -Ooff --opt_for_speed=0 --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common/protobuf-c" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics" --include_path="C:/Tango/Software/Embedded_SW/Embedded" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Hardware" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Printing" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Debugging" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Modules" --include_path="C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/include" --include_path="C:/ti/TivaWare_C_Series-2.1.2.111" --include_path="C:/ti/xdctools_3_32_00_06_core/include" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/TivaWare_C_Series-2.1.1.71b" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/bios_6_45_01_29/packages/ti/sysbios/posix" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/tidrivers_tivac_2_16_00_08" --define=ENABLE_LFN --define=TARGET_IS_TM4C129_RA0 --define=ccs="ccs" --define=ccs --define=TIVAWARE --define=PART_TM4C129XNCZAD -g --gcc --diag_suppress=190 --diag_warning=225 --diag_warning=255 --diag_wrap=off --display_error_number --embedded_constants=off --abi=eabi --preproc_with_compile --preproc_dependency="Modules/Heaters/Heaters_init.d_raw" --obj_directory="Modules/Heaters" $(GEN_OPTS__FLAG) "$<"
+ @echo 'Finished building: $<'
+ @echo ' '
+
+Modules/Heaters/Heaters_maint.obj: ../Modules/Heaters/Heaters_maint.c $(GEN_OPTS) | $(GEN_HDRS)
+ @echo 'Building file: $<'
+ @echo 'Invoking: ARM Compiler'
+ "C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 -me -Ooff --opt_for_speed=0 --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common/protobuf-c" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics" --include_path="C:/Tango/Software/Embedded_SW/Embedded" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Hardware" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Printing" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Debugging" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Modules" --include_path="C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/include" --include_path="C:/ti/TivaWare_C_Series-2.1.2.111" --include_path="C:/ti/xdctools_3_32_00_06_core/include" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/TivaWare_C_Series-2.1.1.71b" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/bios_6_45_01_29/packages/ti/sysbios/posix" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/tidrivers_tivac_2_16_00_08" --define=ENABLE_LFN --define=TARGET_IS_TM4C129_RA0 --define=ccs="ccs" --define=ccs --define=TIVAWARE --define=PART_TM4C129XNCZAD -g --gcc --diag_suppress=190 --diag_warning=225 --diag_warning=255 --diag_wrap=off --display_error_number --embedded_constants=off --abi=eabi --preproc_with_compile --preproc_dependency="Modules/Heaters/Heaters_maint.d_raw" --obj_directory="Modules/Heaters" $(GEN_OPTS__FLAG) "$<"
+ @echo 'Finished building: $<'
+ @echo ' '
+
+Modules/Heaters/Heaters_print.obj: ../Modules/Heaters/Heaters_print.c $(GEN_OPTS) | $(GEN_HDRS)
+ @echo 'Building file: $<'
+ @echo 'Invoking: ARM Compiler'
+ "C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 -me -Ooff --opt_for_speed=0 --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common/protobuf-c" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics" --include_path="C:/Tango/Software/Embedded_SW/Embedded" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Hardware" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Printing" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR/Debugging" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication/PMR" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Communication" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Common" --include_path="C:/Tango/Software/Embedded_SW/Embedded/Modules" --include_path="C:/TI/ccsv7/tools/compiler/ti-cgt-arm_16.9.4.LTS/include" --include_path="C:/ti/TivaWare_C_Series-2.1.2.111" --include_path="C:/ti/xdctools_3_32_00_06_core/include" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/TivaWare_C_Series-2.1.1.71b" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/bios_6_45_01_29/packages/ti/sysbios/posix" --include_path="C:/ti/tirtos_tivac_2_16_00_08/products/tidrivers_tivac_2_16_00_08" --define=ENABLE_LFN --define=TARGET_IS_TM4C129_RA0 --define=ccs="ccs" --define=ccs --define=TIVAWARE --define=PART_TM4C129XNCZAD -g --gcc --diag_suppress=190 --diag_warning=225 --diag_warning=255 --diag_wrap=off --display_error_number --embedded_constants=off --abi=eabi --preproc_with_compile --preproc_dependency="Modules/Heaters/Heaters_print.d_raw" --obj_directory="Modules/Heaters" $(GEN_OPTS__FLAG) "$<"
+ @echo 'Finished building: $<'
+ @echo ' '
+
+
g-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.BL.Entities;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.DB.Managers;
using Tango.SharedUI;
using System.Data.Entity.Infrastructure;
using Tango.MachineStudio.DB.Messages;
using System.Collections.ObjectModel;
using System.Reflection;
using Tango.MachineStudio.Common.StudioApplication;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using Tango.BL;
using Tango.Core.DI;
using Tango.Core.ExtensionMethods;

namespace Tango.MachineStudio.DB.ViewModels
{
    public abstract class DbTableViewModel<T> : ViewModel where T : class, IObservableEntity
    {
        protected INotificationProvider _notification;

        /// <summary>
        /// Initializes a new instance of the <see cref="DbTableViewModel"/> class.
        /// </summary>
        public DbTableViewModel(INotificationProvider notification) : base()
        {
            _notification = notification;
            Adapter = ObservablesEntitiesAdapter.Instance;
            ValidationErrors = new ObservableCollection<string>();

            AddCommand = new RelayCommand(OnAdd);
            EditCommand = new RelayCommand(OnEdit, (x) => SelectedEntity != null);
            DeleteCommand = new RelayCommand(OnDelete, (x) => SelectedEntity != null);
            DialogOKCommand = new RelayCommand(() => OnDialogOKPressed(DialogOpenMode, EditEntity));
            DialogCancelCommand = new RelayCommand(() => OnDialogCancelPressed(DialogOpenMode, EditEntity));

            IsDialogOpen = false;
        }

        private T _editEntity;
        /// <summary>
        /// Gets or sets the edit entity.
        /// </summary>
        public T EditEntity
        {
            get { return _editEntity; }
            set { _editEntity = value; RaisePropertyChangedAuto(); }
        }

        private DialogOpenMode _dialogOpenMode;
        /// <summary>
        /// Gets or sets the dialog open mode.
        /// </summary>
        public DialogOpenMode DialogOpenMode
        {
            get { return _dialogOpenMode; }
            set { _dialogOpenMode = value; RaisePropertyChangedAuto(); }
        }

        private bool _isDialogOpen;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is dialog open.
        /// </summary>
        public bool IsDialogOpen
        {
            get { return _isDialogOpen; }
            set { _isDialogOpen = value; RaisePropertyChangedAuto(); }
        }

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

        private T _selectedEntity;
        /// <summary>
        /// Gets or sets the selected entity.
        /// </summary>
        public T SelectedEntity
        {
            get { return _selectedEntity; }
            set { _selectedEntity = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

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

        /// <summary>
        /// Gets or sets the dialog OK command.
        /// </summary>
        public RelayCommand DialogOKCommand { get; set; }

        /// <summary>
        /// Gets or sets the dialog cancel command.
        /// </summary>
        public RelayCommand DialogCancelCommand { get; set; }

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

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

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

        protected override void OnValidating()
        {
            base.OnValidating();
            ValidationErrors.Clear();

            foreach (var prop in typeof(T).GetPropertiesWithAttribute<ColumnAttribute>(BindingFlags.Public | BindingFlags.Instance).Where(x => !x.PropertyType.IsGenericType && x.PropertyType.IsClass && !x.Name.Contains("Guid")))
            {
                if (prop.GetValue(EditEntity) == null)
                {
                    ValidationErrors.Add(prop.Name + " is required");
                }
            }
        }

        /// <summary>
        /// Called when delete command invoked.
        /// </summary>
        protected virtual async void OnDelete()
        {
            using (_notification.PushTaskItem("Saving changes to database..."))
            {
                try
                {
                    SelectedEntity.Detach(Adapter.Context);
                    await Adapter.Context.SaveChangesAsync();
                }
                catch (Exception ex)
                {
                    Adapter.Invalidate();
                    _notification.ShowError("Could not delete entity." + Environment.NewLine + ex.Message);
                }

                SelectedEntity = null;
            }
        }

        /// <summary>
        /// Called when edit command invoked.
        /// </summary>
        protected virtual void OnEdit()
        {
            ValidationErrors.Clear();
            DialogOpenMode = DialogOpenMode.Editing;
            EditEntity = GetEditableEntity(DialogOpenMode);
            TangoMessenger.Default.Send(new OpenEntityEditViewMessage(DialogOpenMode, this, typeof(T)));
            IsDialogOpen = true;
        }

        /// <summary>
        /// Called when add command invoked.
        /// </summary>
        protected virtual void OnAdd()
        {
            ValidationErrors.Clear();
            DialogOpenMode = DialogOpenMode.Adding;
            EditEntity = GetEditableEntity(DialogOpenMode);

            var codeProp = EditEntity.GetType().GetProperty("Code");

            if (codeProp != null)
            {
                if (EditEntity.GetDbSet<T>(Adapter.Context).Count() > 0)
                {
                    int lastCode = EditEntity.GetDbSet<T>(Adapter.Context).ToList().Max(x => (int)codeProp.GetValue(x));
                    codeProp.SetValue(EditEntity, lastCode + 1);
                }
            }

            TangoMessenger.Default.Send(new OpenEntityEditViewMessage(DialogOpenMode, this, typeof(T)));
            IsDialogOpen = true;
        }

        /// <summary>
        /// Called when dialog closes with OK button.
        /// </summary>
        /// <param name="mode">The mode.</param>
        protected virtual async void OnDialogOKPressed(DialogOpenMode mode, T entity)
        {
            if (!Validate()) return;

            if (ValidationErrors.Count > 0) return;

            var codeProp = entity.GetType().GetProperty("Code");

            if (codeProp != null)
            {
                int code = (int)codeProp.GetValue(entity);

                if (entity.GetDbSet<T>(Adapter.Context).ToList().Where(x => x.Guid != entity.Guid).Select(x => (int)codeProp.GetValue(x)).Contains(code))
                {
                    _notification.ShowError("The entity code specified already exists.");
                    return;
                }
            }

            TangoMessenger.Default.Send(new CloseEntityEditViewMessage());

            if (mode == DialogOpenMode.Editing)
            {
                entity.ShallowCopyTo(SelectedEntity);
                entity = SelectedEntity;
            }

            OnBeforeEntitySave(mode, entity);

            using (_notification.PushTaskItem("Saving changes to database..."))
            {
                if (mode == DialogOpenMode.Adding)
                {
                    entity.Attach(Adapter.Context);
                }

                try
                {
                    await entity.SaveAsync(Adapter.Context);
                }
                catch (DbUpdateException ex)
                {
                    if (mode == DialogOpenMode.Adding)
                    {
                        entity.Detach(Adapter.Context);
                    }
                    Adapter.Invalidate();
                    _notification.ShowError("Could not save entity." + Environment.NewLine + ex.InnerException.InnerException != null ? ex.InnerException.InnerException.Message : ex.InnerException.Message);
                }
                catch (Exception)
                {
                    Adapter.Invalidate();
                    _notification.ShowError("Could not save entity." + Environment.NewLine + "Please make sure all fields are properly populated.");
                }
                IsDialogOpen = false;
                SelectedEntity = EditEntity;
                SelectedEntity = null;
            }
        }

        /// <summary>
        /// Called when [before entity save].
        /// </summary>
        /// <param name="mode">The mode.</param>
        /// <param name="entity">The entity.</param>
        protected virtual void OnBeforeEntitySave(DialogOpenMode mode, T entity)
        {

        }

        /// <summary>
        /// Called when dialog closes with cancel button.
        /// </summary>
        /// <param name="mode">The mode.</param>
        protected virtual void OnDialogCancelPressed(DialogOpenMode mode, T entity)
        {
            TangoMessenger.Default.Send(new CloseEntityEditViewMessage());
            IsDialogOpen = false;
        }

        /// <summary>
        /// Gets the editable entity.
        /// </summary>
        /// <param name="mode">The mode.</param>
        /// <returns></returns>
        private T GetEditableEntity(DialogOpenMode mode)
        {
            if (mode == DialogOpenMode.Adding)
            {
                var newEntity = Activator.CreateInstance<T>();
                InitializeEntity(newEntity);
                return newEntity;
            }
            else
            {
                return SelectedEntity.ShallowClone();
            }
        }

        protected virtual void OnFilterChanged(String filter)
        {
            String viewSourceName = this.GetType().Name.Replace("ViewVM", "ViewSource");
            ICollectionView collectionView = Adapter.GetType().GetProperty(viewSourceName).GetValue(Adapter) as ICollectionView;

            collectionView.Filter = (entity) =>
            {
                return FilterEntity((T)entity, filter);
            };
        }

        private bool FilterEntity(T entity, String filter)
        {
            foreach (var prop in entity.GetType().GetPropertiesWithAttribute<ColumnAttribute>(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType.IsClass && x.PropertyType != typeof(String) && x.PropertyType != typeof(byte[]) && !x.PropertyType.IsGenericType))
            {
                object obj = prop.GetValue(entity);

                if (obj != null)
                {
                    foreach (var innerProp in obj.GetType().GetPropertiesWithAttribute<ColumnAttribute>(BindingFlags.Public | BindingFlags.Instance).Where(x => x.Name != "Deleted" && x.Name != "ID" && x.Name != "LastUpdated").Where(x => !x.PropertyType.IsGenericType && (x.PropertyType.IsClass || x.PropertyType == typeof(String))))
                    {
                        object value = innerProp.GetValue(obj);

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

            return
              entity.
              GetType().
              GetPropertiesWithAttribute<ColumnAttribute>(BindingFlags.Public | BindingFlags.Instance).
              Where(x => x.Name != "Deleted" && x.Name != "ID" && x.Name != "LastUpdated").
              Where(x => !x.PropertyType.IsGenericType && (x.PropertyType.IsClass || x.PropertyType == typeof(String))).
              Select(prop => prop.GetValue(entity).ToString()).
              ToList().
              Any(x => x.ToLower().Contains(filter.ToLower()));
        }

        protected virtual void InitializeEntity(T entity)
        {

        }
    }
}