Преглед на файлове

Merge remote-tracking branch 'origin/frank' into kenric

Kenric Nugteren преди 2 години
родител
ревизия
ef40291eec

+ 3 - 1
InABox.Core/BaseObject.cs

@@ -200,7 +200,9 @@ namespace InABox.Core
             {
                 try
                 {
-                    var prop = GetType().GetRuntimeProperty(key);
+                    var prop = key.Contains(".") 
+                        ? CoreUtils.GetProperty(GetType(),key) 
+                        : GetType().GetRuntimeProperty(key);
                     if(prop != null)
                     {
                         if (prop.SetMethod != null)

+ 46 - 0
InABox.Core/Classes/CoreTime.cs

@@ -0,0 +1,46 @@
+using System;
+
+namespace InABox.Core
+{
+    public class CoreTime : BaseObject, IEnclosedEntity
+    {
+        [TimeOfDayEditor]
+        [EditorSequence(1)]
+        [LoggableProperty(Format = "HH\\:mm")]
+        public TimeSpan Start { get; set; }
+        
+        [DurationEditor(Summary = Summary.Sum)]
+        [EditorSequence(2)]
+        public TimeSpan Duration { get; set; }
+        
+        [TimeOfDayEditor]
+        [EditorSequence(3)]
+        [LoggableProperty(Format = "HH\\:mm")]
+        public TimeSpan Finish { get; set; }
+
+
+        private bool bChanging = false;
+        
+        protected override void DoPropertyChanged(string name, object before, object after)
+        {
+            base.DoPropertyChanged(name, before, after);
+            
+            if (bChanging)
+                return;
+            bChanging = true;
+            
+            if (String.Equals(name,nameof(Start)))
+                Duration = Finish > (TimeSpan)after ? Finish.Subtract((TimeSpan)after) : new TimeSpan();
+
+            else if (String.Equals(name,nameof(Finish)))
+                Duration = (TimeSpan)after > Start ? ((TimeSpan)after).Subtract(Start) : new TimeSpan();
+            
+            else if (String.Equals(name,nameof(Duration)))
+                Finish = Start.Add((TimeSpan)after);
+            
+            bChanging = false;
+            
+        }
+        
+    }
+}

+ 23 - 13
InABox.Core/EntityLink.cs

@@ -47,27 +47,37 @@ namespace InABox.Core
         public virtual bool Synchronise(object Entity)
         {
             var result = false;
-            var props = CoreUtils.PropertyList(GetType(),
-                x => (!x.Name.Equals("ID") || Entity == null) && !x.DeclaringType.Equals(typeof(BaseObject)), false);
+            var props = CoreUtils.PropertyList(GetType(), x => (!x.Name.Equals("ID") || Entity == null) && !x.DeclaringType.Equals(typeof(BaseObject)), false);
             foreach (var key in props.Keys)
             {
                 if (CoreUtils.HasProperty(Entity.GetType(), key))
                 {
                     var prop = CoreUtils.GetProperty(typeof(T), key);
-                    if (prop != null && prop.PropertyType.Equals(props[key]) && !prop.PropertyType.GetInterfaces().Any(x => x == typeof(IEntityLink)))
+                    if (prop != null && prop.PropertyType.Equals(props[key]))
+                        
                     {
-                        var oldvalue = CoreUtils.GetPropertyValue(this, key);
-                        var newvalue = CoreUtils.GetPropertyValue(Entity, key);
-                        if ((oldvalue == null && newvalue != null) || (oldvalue != null && !oldvalue.Equals(newvalue)))
+                        if (prop.PropertyType.GetInterfaces().Any(x => x == typeof(IEntityLink)))
                         {
-                            result = true;
-                            try
-                            {
-                                CoreUtils.SetPropertyValue(this, key, newvalue);
-                            }
-                            catch (Exception e)
+                            var tgtlink = CoreUtils.GetPropertyValue(this, key) as IEntityLink;
+                            var srclink = CoreUtils.GetPropertyValue(Entity, key) as IEntityLink;
+                            tgtlink.ID = srclink.ID;
+                            tgtlink.Synchronise(srclink);
+                        }
+                        else
+                        {
+                            var oldvalue = CoreUtils.GetPropertyValue(this, key);
+                            var newvalue = CoreUtils.GetPropertyValue(Entity, key);
+                            if ((oldvalue == null && newvalue != null) || (oldvalue != null && !oldvalue.Equals(newvalue)))
                             {
-                                Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+                                result = true;
+                                try
+                                {
+                                    CoreUtils.SetPropertyValue(this, key, newvalue);
+                                }
+                                catch (Exception e)
+                                {
+                                    Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+                                }
                             }
                         }
                     }

+ 1 - 0
InABox.DynamicGrid/BaseDynamicGrid.cs

@@ -60,6 +60,7 @@ namespace InABox.DynamicGrid
         public event OnCreateItem? OnCreateItem;
         public abstract event OnCustomiseEditor<T>? OnCustomiseEditor;
         public abstract event OnCustomiseColumns? OnCustomiseColumns;
+        public abstract event OnDoubleClick? OnDoubleClick;
 
         public OnGetDynamicGridStyle? OnGetStyle { get; set; }
 

+ 69 - 19
InABox.DynamicGrid/DynamicGrid.cs

@@ -367,9 +367,7 @@ namespace InABox.DynamicGrid
 
         #region Events
 
-        public event SelectItemHandler? OnSelectItem;
-
-        public event OnDoubleClick? OnDoubleClick;
+        public event SelectItemHandler? OnSelectItem;       
 
         public event OnCellDoubleClick? OnCellDoubleClick;
 
@@ -383,6 +381,8 @@ namespace InABox.DynamicGrid
 
         public override event OnFilterRecord? OnFilterRecord;
 
+        public override event OnDoubleClick? OnDoubleClick;
+
         #endregion
 
         public DynamicGrid() : base()
@@ -508,10 +508,6 @@ namespace InABox.DynamicGrid
             Edit.Margin = new Thickness(0, 2, 2, 0);
             Edit.Click += Edit_Click;
 
-            /*MultiEdit = CreateButton(Properties.Resources.doc_xls.AsBitmapImage(Color.White));
-            MultiEdit.Margin = new Thickness(0, 2, 2, 0);
-            MultiEdit.Click += MultiEdit_Click;*/
-
             EditSpacer = new Label { Width = 5 };
 
             Print = CreateButton(Properties.Resources.print.AsBitmapImage(Color.White));
@@ -653,8 +649,7 @@ namespace InABox.DynamicGrid
 
             Add.Visibility = Options.Contains(DynamicGridOption.AddRows) ? Visibility.Visible : Visibility.Collapsed;
             Edit.Visibility = Options.Contains(DynamicGridOption.EditRows) ? Visibility.Visible : Visibility.Collapsed;
-            /*MultiEdit.Visibility =
-                Visibility.Collapsed; // _Options.Contains(DynamicGridOptions.DirectEdit) ? Visibility.Visible : Visibility.Collapsed;*/
+            
             EditSpacer.Visibility = Options.Contains(DynamicGridOption.AddRows) || Options.Contains(DynamicGridOption.EditRows)
                 ? Visibility.Visible
                 : Visibility.Collapsed;
@@ -744,7 +739,7 @@ namespace InABox.DynamicGrid
         {
             if (!Options.Contains(DynamicGridOption.DirectEdit))
                 return;
-            if (!DataGrid.SelectionController.CurrentCellManager.CurrentCell.IsEditing && e.ActivationTrigger == ActivationTrigger.Keyboard)
+            if ((DataGrid.SelectionController.CurrentCellManager.CurrentCell?.IsEditing != true) && e.ActivationTrigger == ActivationTrigger.Keyboard)
                 DataGrid.SelectionController.CurrentCellManager.BeginEdit();
         }
 
@@ -934,14 +929,15 @@ namespace InABox.DynamicGrid
 
         protected void UpdateCell(int row, string colname, object value)
         {
+            var datacolname = colname.Replace(".", "_");
             var table = DataGridItems;
-            var colno = table.Columns.IndexOf(colname);
+            var colno = table.Columns.IndexOf(datacolname);
             var corecol = Data.Columns[colno].ColumnName;
             var corerow = Data.Rows[row];
             corerow[corecol] = value;
 
             var datarow = table.Rows[row];
-            datarow[colname] = value;
+            datarow[datacolname] = value;
         }
 
         private void DataGrid_CurrentCellEndEdit(object? sender, CurrentCellEndEditEventArgs e)
@@ -951,7 +947,8 @@ namespace InABox.DynamicGrid
                 return;
             if (inplaceeditor is not null && bChanged) UpdateData(inplaceeditor, e.RowColumnIndex.ColumnIndex);
             bChanged = false;
-            inplaceeditor = null;
+            inplaceeditor = null; 
+            DataGridItems.AcceptChanges();
         }
 
         private void UpdateData(T obj, int columnindex)
@@ -959,6 +956,8 @@ namespace InABox.DynamicGrid
             var table = DataGridItems;
 
             var iRow = SelectedRows.First().Index; //e.RowColumnIndex.RowIndex - (Options.Contains(DynamicGridOptions.FilterRows) ? 2 : 1);
+            if (iRow > table.Rows.Count)
+                return;
             var row = table.Rows[iRow];
             var colname = DataGrid.Columns[columnindex].MappingName;
             var value = row[colname];
@@ -968,18 +967,46 @@ namespace InABox.DynamicGrid
             var corerow = Data.Rows[iRow];
             corerow[corecol] = value;
 
-            CoreUtils.SetPropertyValue(obj, corecol, value);
+            Dictionary<String, object> changes = new Dictionary<string, object>();
+            if (DataGrid.Columns[colname] is GridComboBoxColumn combo)
+            {
+
+                var prefix = String.Join(".",corecol.Split(".").Reverse().Skip(1).Reverse());
+                var field = corecol.Split(".").Last();             
+                var lookups = (combo.ItemsSource as DataView)?.Table;
+                if (lookups != null)
+                {
+                    var lookuprow = lookups.AsEnumerable().FirstOrDefault(x => x[field] == value);
+                    if (lookuprow != null)
+                    {
+                        foreach (DataColumn lookupcol in lookups.Columns)
+                        {
+                            var prop = String.Join(".", new String[] { prefix, lookupcol.ColumnName });
+                            DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, prop, lookuprow[lookupcol], changes);
+                            //CoreUtils.SetPropertyValue(obj, prop, lookuprow[lookupcol]);
+                        }
+                    }
+                }
+            }
+            else
+                DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, corecol, value, changes);
+                //CoreUtils.SetPropertyValue(obj, corecol, value);
+
+
             SaveItem(obj);
-            Data.LoadRow(corerow, obj);
+            foreach (var key in changes.Keys)
+                UpdateCell(iRow, key, changes[key]);
+            //Data.LoadRow(corerow, obj);
 
             foreach (var column in Data.Columns.Where(x => !string.Equals(corecol, x.ColumnName)))
             {
                 var scol = column.ColumnName.Replace('.', '_');
-                row[scol] = corerow[column.ColumnName];
+                row[scol] = corerow[column.ColumnName] ?? DBNull.Value;
             }
 
             for (var i = 0; i < ActionColumns.Count; i++) 
                 row[string.Format("ActionColumn{0}", i)] = ActionColumns[i].Data(corerow);
+            
         }
 
         private void DataGrid_QueryRowHeight(object? sender, QueryRowHeightEventArgs e)
@@ -1692,7 +1719,6 @@ namespace InABox.DynamicGrid
                         lookupcol.SelectedValuePath = table.Columns[0].ColumnName;
                         lookupcol.DisplayMemberPath = "Display";
                         lookupcol.ItemsSource = table.DefaultView;
-
                         newcol = lookupcol;
                     }
                     else
@@ -2065,7 +2091,7 @@ namespace InABox.DynamicGrid
 
         //IncrementalList<T> _data = null;
 
-        private void InvalidateRow(CoreRow row)
+        protected void InvalidateRow(CoreRow row)
         {
             var rowdata = new List<object?>(row.Values);
             foreach (var ac in ActionColumns)
@@ -2402,7 +2428,30 @@ namespace InABox.DynamicGrid
 
         private void Add_Click(object sender, RoutedEventArgs e)
         {
-            DoAdd();
+            if (Options.Contains(DynamicGridOption.DirectEdit))
+            {
+                if (!CanCreateItems())
+                    return;
+                
+                var item = CreateItem();
+                SaveItem(item);
+                
+                var datarow = Data.NewRow();
+                ObjectToRow(item, datarow);
+                Data.Rows.Add(datarow);
+                
+                var masterrow = MasterData.NewRow();
+                ObjectToRow(item, masterrow);
+                MasterData.Rows.Add(masterrow);
+                
+                _recordmap[datarow] = masterrow;
+                
+                InvalidateGrid();
+                SelectedRows = new[] { datarow };
+                OnChanged?.Invoke(this);
+            }
+            else
+                DoAdd();
         }
         public virtual DynamicEditorPages LoadEditorPages(T item)
         {
@@ -2418,6 +2467,7 @@ namespace InABox.DynamicGrid
 
         public virtual void LoadEditorButtons(T item, DynamicEditorButtons buttons)
         {
+            buttons.Clear();
             buttons.Add(
                 "",
                 Properties.Resources.help.AsBitmapImage(),

+ 23 - 13
InABox.DynamicGrid/Editors/PopupList.xaml.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Input;
 using InABox.Core;
 using InABox.Wpf;
 
@@ -106,33 +107,42 @@ namespace InABox.DynamicGrid
 
             _grid.SelectedRows = _grid.Data.Rows.Where(r => r.Get<Guid>("ID").Equals(ID)).ToArray();
 
+            _grid.OnDoubleClick += Grid_OnDoubleClick;
+            
             //Left = screen.DeviceBounds.Left + ((screen.DeviceBounds.Width - Width) / 2.0F);
             //Top = screen.DeviceBounds.Top + ((screen.DeviceBounds.Height - Height) / 2.0F);
             //WpfScreen.CenterWindowOnScreen(this);
         }
 
+        private void Grid_OnDoubleClick(object sender, System.ComponentModel.HandledEventArgs args)
+        {
+            if (_grid.SelectedRows.Any())
+                CheckSelectedAndClose();
+        }
 
         private void OKButton_Click(object sender, RoutedEventArgs e)
         {
             if (_grid.SelectedRows.Any())
-            {
-                ID = _grid.SelectedRows.First().Get<Guid>("ID");
+                CheckSelectedAndClose();
+            else
+                MessageBox.Show("Please select an Item first");
 
-                //AsLookup = _grid.SelectedRows.First().Get<String>("AsLookup");
+        }
 
-                foreach (var key in OtherValues.Keys.ToArray())
-                {
-                    var comps = key.Split(new[] { "->" }, StringSplitOptions.None);
-                    OtherValues[key] = _grid.SelectedRows.First().Get<object>(comps.First());
-                }
+        private void CheckSelectedAndClose()
+        {
+            ID = _grid.SelectedRows.First().Get<Guid>("ID");
 
-                DialogResult = true;
-                Close();
-            }
-            else
+            //AsLookup = _grid.SelectedRows.First().Get<String>("AsLookup");
+
+            foreach (var key in OtherValues.Keys.ToArray())
             {
-                MessageBox.Show("Please select an Item first");
+                var comps = key.Split(new[] { "->" }, StringSplitOptions.None);
+                OtherValues[key] = _grid.SelectedRows.First().Get<object>(comps.First());
             }
+
+            DialogResult = true;
+            Close();
         }
 
         private void CancelButton_Click(object sender, RoutedEventArgs e)

+ 1 - 0
InABox.DynamicGrid/EmbeddedDynamicEditorForm.xaml.cs

@@ -285,6 +285,7 @@ namespace InABox.DynamicGrid
             if (Pages == null || Pages.Count == 0)
                 Editor.Margin = new Thickness(5, 5, 5, 0);
 
+            Buttons.Children.Clear();
             if (buttons != null)
                 foreach (var button in buttons)
                 {

+ 2 - 0
InABox.DynamicGrid/IDynamicGrid.cs

@@ -33,6 +33,8 @@ namespace InABox.DynamicGrid
         event OnFilterRecord OnFilterRecord;
         event OnCreateItem OnCreateItem;
 
+        event OnDoubleClick? OnDoubleClick;
+
         void AddVisualFilter(string column, string value);
 
         event OnDefineFilter OnDefineFilter;

+ 6 - 1
InABox.DynamicGrid/PDF/DocumentEditor.xaml.cs

@@ -36,11 +36,14 @@ namespace InABox.DynamicGrid
 
         //public bool PrintAllowed { get; set; }
         public bool SaveAllowed { get; set; }
+        public bool ButtonsVisible { get; set; }
         public string Watermark { get; set; }
 
+        private bool bClosing = false;
+        
         private void Documents_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
-            if (!bReady)
+            if (!bReady || (!ButtonsVisible && bClosing))
                 return;
 
             for (var i = 0; i < e.RemovedItems.Count; i++)
@@ -72,6 +75,7 @@ namespace InABox.DynamicGrid
                             var pdf = new PDFEditorControl();
                             //pdf.PrintAllowed = PrintAllowed;
                             pdf.SaveAllowed = SaveAllowed;
+                            pdf.ButtonsVisible = ButtonsVisible;
                             pdf.Watermark = Watermark;
                             editor = pdf;
                         }
@@ -94,6 +98,7 @@ namespace InABox.DynamicGrid
 
         protected override void OnClosing(CancelEventArgs e)
         {
+            bClosing = true;
             base.OnClosing(e);
             Documents.SelectedIndex = -1;
         }

+ 5 - 1
InABox.DynamicGrid/PDF/PDFEditorControl.xaml.cs

@@ -43,6 +43,8 @@ namespace InABox.DynamicGrid
         public PDFEditorControl()
         {
             InitializeComponent();
+            SaveAllowed = false;
+            ButtonsVisible = true;
 
             PdfViewer.ReferencePath =
                 AppDomain.CurrentDomain.BaseDirectory; // System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "pdfium");
@@ -55,6 +57,8 @@ namespace InABox.DynamicGrid
         //public bool PrintAllowed { get; set; }
 
         public bool SaveAllowed { get; set; }
+        
+        public bool ButtonsVisible { get; set; }
 
         public string Watermark { get; set; }
 
@@ -584,7 +588,7 @@ namespace InABox.DynamicGrid
 
         private void UpdateButtons(Image selected)
         {
-            PDFButtonStack.Width = Document != null && Document.Superceded.IsEmpty()
+            PDFButtonStack.Width = Document != null && Document.Superceded.IsEmpty() && ButtonsVisible
                 ? new GridLength(44, GridUnitType.Pixel)
                 : new GridLength(0, GridUnitType.Pixel);