|  | @@ -5,13 +5,13 @@ using System.Collections.Generic;
 | 
	
		
			
				|  |  |  namespace Comal.Classes
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public abstract class Dimensions<TLink,TUnit> : EnclosedEntity, IDimensions 
 | 
	
		
			
				|  |  | -        where TLink : DimensionUnitLink<TUnit>, new() 
 | 
	
		
			
				|  |  | +    public abstract class Dimensions<TLink, TUnit> : EnclosedEntity, IDimensions
 | 
	
		
			
				|  |  | +        where TLink : DimensionUnitLink<TUnit>, new()
 | 
	
		
			
				|  |  |          where TUnit : DimensionUnit, new()
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public Dimensions() : base() { }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          public Dimensions(Func<BaseObject> entity) : base(entity) { }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          [EditorSequence(1)]
 | 
	
	
		
			
				|  | @@ -20,93 +20,93 @@ namespace Comal.Classes
 | 
	
		
			
				|  |  |          public abstract TLink Unit { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public IDimensionUnit GetUnit() => Unit;
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          [DoubleEditor(Visible = Visible.Hidden)]
 | 
	
		
			
				|  |  |          [EditorSequence(2)]
 | 
	
		
			
				|  |  |          [Caption("Quantity", IncludePath = false)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract double Quantity { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          [DoubleEditor(Visible = Visible.Hidden)]
 | 
	
		
			
				|  |  |          [EditorSequence(3)]
 | 
	
		
			
				|  |  |          [Caption("Length", IncludePath = false)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract double Length { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          [DoubleEditor(Visible = Visible.Hidden)]
 | 
	
		
			
				|  |  |          [EditorSequence(4)]
 | 
	
		
			
				|  |  |          [Caption("Width", IncludePath = false)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract double Width { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          [DoubleEditor(Visible = Visible.Hidden)]
 | 
	
		
			
				|  |  |          [EditorSequence(5)]
 | 
	
		
			
				|  |  |          [Caption("Height", IncludePath = false)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract double Height { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          [DoubleEditor(Visible = Visible.Hidden)]
 | 
	
		
			
				|  |  |          [EditorSequence(6)]
 | 
	
		
			
				|  |  |          [Caption("Weight", IncludePath = false)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract double Weight { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          [DoubleEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
 | 
	
		
			
				|  |  |          [Caption("Value", IncludePath = false)]
 | 
	
		
			
				|  |  |          [EditorSequence(7)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract double Value { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -        [TextBoxEditor(Visible = Visible.Default, Editable=Editable.Hidden)]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TextBoxEditor(Visible = Visible.Default, Editable = Editable.Hidden)]
 | 
	
		
			
				|  |  |          [EditorSequence(8)]
 | 
	
		
			
				|  |  |          [Caption("Unit Size", IncludePath = false)]
 | 
	
		
			
				|  |  |          [RequiredColumn]
 | 
	
		
			
				|  |  |          public abstract String UnitSize { get; set; }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          protected override void Init()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              base.Init();
 | 
	
		
			
				|  |  |              Unit = Activator.CreateInstance(typeof(TLink), new object[] { new Func<BaseObject>(LinkedEntity) }) as TLink;
 | 
	
		
			
				|  |  |              Unit.PropertyChanged += (s, e) =>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                if(e.PropertyName == "ID")
 | 
	
		
			
				|  |  | +                if (e.PropertyName == "ID")
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      DoPropertyChanged("Unit." + e.PropertyName, OriginalValues.GetValueOrDefault("Unit." + e.PropertyName), Unit.ID);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                else if(e.PropertyName == "Formula")
 | 
	
		
			
				|  |  | +                else if (e.PropertyName == "Formula")
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      DoPropertyChanged("Unit." + e.PropertyName, OriginalValues.GetValueOrDefault("Unit." + e.PropertyName), Unit.Formula);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                else if(e.PropertyName == "Format")
 | 
	
		
			
				|  |  | +                else if (e.PropertyName == "Format")
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      DoPropertyChanged("Unit." + e.PropertyName, OriginalValues.GetValueOrDefault("Unit." + e.PropertyName), Unit.Format);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          private bool bCalculating = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> unitid = new Column<Dimensions<TLink,TUnit>>(x => x.Unit.ID);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> quantity = new Column<Dimensions<TLink,TUnit>>(x => x.Quantity);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> length = new Column<Dimensions<TLink,TUnit>>(x => x.Length);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> width = new Column<Dimensions<TLink,TUnit>>(x => x.Width);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> height = new Column<Dimensions<TLink,TUnit>>(x => x.Height);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> weight = new Column<Dimensions<TLink,TUnit>>(x => x.Weight);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> sizeformula = new Column<Dimensions<TLink,TUnit>>(x => x.Unit.Formula);
 | 
	
		
			
				|  |  | -        private static Column<Dimensions<TLink,TUnit>> sizeformat = new Column<Dimensions<TLink,TUnit>>(x => x.Unit.Format);
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> unitid = new Column<Dimensions<TLink, TUnit>>(x => x.Unit.ID);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> quantity = new Column<Dimensions<TLink, TUnit>>(x => x.Quantity);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> length = new Column<Dimensions<TLink, TUnit>>(x => x.Length);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> width = new Column<Dimensions<TLink, TUnit>>(x => x.Width);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> height = new Column<Dimensions<TLink, TUnit>>(x => x.Height);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> weight = new Column<Dimensions<TLink, TUnit>>(x => x.Weight);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> sizeformula = new Column<Dimensions<TLink, TUnit>>(x => x.Unit.Formula);
 | 
	
		
			
				|  |  | +        private static Column<Dimensions<TLink, TUnit>> sizeformat = new Column<Dimensions<TLink, TUnit>>(x => x.Unit.Format);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          protected override void DoPropertyChanged(string name, object? before, object? after)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              base.DoPropertyChanged(name, before, after);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (bCalculating)
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              bCalculating = true;
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              try
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  if (unitid.IsEqualTo(name))
 | 
	
		
			
				|  |  |                      Calculate(Quantity, Length, Width, Height, Weight, Unit.Formula, Unit.Format);
 | 
	
		
			
				|  |  |                  else if (quantity.IsEqualTo(name))
 | 
	
	
		
			
				|  | @@ -154,11 +154,11 @@ namespace Comal.Classes
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              finally
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                bCalculating = false;                
 | 
	
		
			
				|  |  | +                bCalculating = false;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          private void Calculate(object? quantity, object? length, object? width, object? height, object? weight, string? formula, string? format)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (Evaluate<double>(formula, quantity, length, width, height, weight, out double value))
 | 
	
	
		
			
				|  | @@ -169,7 +169,7 @@ namespace Comal.Classes
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private bool Evaluate<T>(string? formula, object? quantity, object? length, object? width, object? height, object? weight, out T result)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              if (!String.IsNullOrWhiteSpace(formula))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  var variables = new Dictionary<string, object?>()
 | 
	
	
		
			
				|  | @@ -184,7 +184,7 @@ namespace Comal.Classes
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      var expr = new CoreExpression(formula);
 | 
	
		
			
				|  |  |                      var eval = expr.Evaluate(variables);
 | 
	
		
			
				|  |  | -                    result = (T)CoreUtils.ChangeType(eval,typeof(T));
 | 
	
		
			
				|  |  | +                    result = (T)CoreUtils.ChangeType(eval, typeof(T));
 | 
	
		
			
				|  |  |                      return true;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  catch (Exception e)
 | 
	
	
		
			
				|  | @@ -215,5 +215,20 @@ namespace Comal.Classes
 | 
	
		
			
				|  |  |              if (!observing)
 | 
	
		
			
				|  |  |                  SetObserving(true);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public override string ToString()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var result = Value != 0 ? Math.Round(Value, 3).ToString() : "";
 | 
	
		
			
				|  |  | +            result = !string.IsNullOrWhiteSpace(UnitSize) ? result + " " + UnitSize + ", " : "Empty unitsize";
 | 
	
		
			
				|  |  | +            result = Quantity != 0 ? result + "Quantity: " + Quantity + ", " : result;
 | 
	
		
			
				|  |  | +            result = Length != 0 ? result + "Length: " + Length + ", " : result;
 | 
	
		
			
				|  |  | +            result = Width != 0 ? result + "Width: " + Width + ", " : result;
 | 
	
		
			
				|  |  | +            result = Height != 0 ? result + "Height: " + Height + ", " : result;
 | 
	
		
			
				|  |  | +            result = Weight != 0 ? result + "Weight: " + Weight : result;
 | 
	
		
			
				|  |  | +            if (result.EndsWith(", "))
 | 
	
		
			
				|  |  | +                result = result.Remove(result.Length - 2);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return result;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |