using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WebWindowComplex.Json; using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models { public class SplitDimension:AreaDimension { #region Public Constructors public SplitDimension(double dDimension, MeasureTypes MeasureType, bool bIsRelative, Split Parent, bool IsVertList):base(dDimension, MeasureType, Parent) { m_dDimension = dDimension; m_bIsRelative = bIsRelative; m_Parent = Parent; m_bIsVertListDim = IsVertList; } #endregion Public Constructors #region Public Properties public bool bIsRelative { get { return m_bIsRelative; } } public bool bIsVertListDim { get { return m_bIsVertListDim; } } public override double dDimension { get { return m_dDimension; } set { double dimensionTot = 0; List dimensions = new List(); Frame frame = m_Parent.ParentWindow.AreaList.FirstOrDefault() ?? new Frame(null, Parent.ParentWindow); double width = CalculateWidthSplitGroup(frame, frame.AvailWidthArea(), new AreaFound(-1, false)).m_Dimension; foreach (var item in m_Parent.ElemDimVertList) { width = width - item.dDimension; } double height = (CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false))).m_Dimension; foreach (var item in m_Parent.ElemDimHorizList) { height = height - item.dDimension; } if (bIsVertListDim) { dimensions = m_Parent.SplitVertList; dimensionTot = width; } else { dimensions = m_Parent.SplitHorizList; dimensionTot = height; } double valMinAbsolute = 100; double valMaxAbsolute = dimensionTot - valMinAbsolute * (dimensions.Count - 1); bool valueAccept = false; switch (MeasureType) { case MeasureTypes.ABSOLUTE: { valueAccept = (value < valMaxAbsolute && value > valMinAbsolute) ? true : false; break; } case MeasureTypes.PROPORTIONAL: { valMaxAbsolute = 20; valueAccept = (value >= 1) ? true : false; break; } case MeasureTypes.PERCENTAGE: { valMaxAbsolute = valMaxAbsolute / dimensionTot * 100; valMinAbsolute = valMinAbsolute / dimensionTot * 100; valueAccept = (value < valMaxAbsolute && value > valMinAbsolute) ? true : false; break; } } if (valueAccept) { List absoluteValList = new List(); AreaDimension ad = new AreaDimension(dDimension, SelMeasureType, Parent); List adList = new List(); foreach (var it in dimensions) { adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType, it.Parent)); } foreach (var item in dimensions) { absoluteValList.Add(item.CalculateAbsoluteValue(adList, dimensionTot)); } int nIndex = dimensions.IndexOf(this); int proportionalCount = dimensions.Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)).ToList().Count; int percentageCount = dimensions.Where(x => x.MeasureType.Equals(MeasureTypes.PERCENTAGE)).ToList().Count; // Le dimensioni sono solo in proporzionale if (proportionalCount == absoluteValList.Count) { m_dDimension = value; } // Le dimensioni sono solo in percentuale else if (percentageCount == dimensions.Count) { if (value < dDimension) { // L'anta modificata non è l'ultima if (nIndex < dimensions.Count - 1) dimensions[nIndex + 1].SetDimension(dimensions[nIndex + 1].dDimension + (m_dDimension - value)); else if (dimensions.Count > 1) dimensions[nIndex - 1].SetDimension(dimensions[nIndex - 1].dDimension + (m_dDimension - value)); else { m_dDimension = 100; return; } } else { double dRes = value; // se non ultima anta if (nIndex < dimensions.Count - 1) { for (var nInd = 0; nInd <= nIndex - 1; nInd++) dRes += dimensions[nInd].dDimension; dRes = (100 - dRes) / (dimensions.Count - nIndex - 1); for (var Ind = nIndex + 1; Ind <= dimensions.Count - 1; Ind++) dimensions[Ind].SetDimension(dRes); } // se ultima anta else if (dimensions.Count > 1) { if (dimensions.Count > 2) { for (var Ind = 0; Ind <= nIndex - 2; Ind++) dRes += dimensions[Ind].dDimension; } dRes = (100 - dRes); dimensions[nIndex - 1].SetDimension(dRes); } else { m_dDimension = 100; return; } } m_dDimension = value; } // Le dimensioni sono miste o solo in assoluto else { double valueInAbsolute = 0; switch (MeasureType) { case MeasureTypes.ABSOLUTE: { valueInAbsolute = value; break; } case MeasureTypes.PROPORTIONAL: { var pesi = value + dimensions .Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL) && !x.Equals(this)) .Sum(x => x.m_dDimension); valueInAbsolute = dimensionTot / pesi * value; break; } case MeasureTypes.PERCENTAGE: { valueInAbsolute = (value / 100) * dimensionTot; break; } } if (value < dDimension) { // L'anta modificata non è l'ultima if (nIndex < absoluteValList.Count - 1) { absoluteValList[nIndex + 1] = absoluteValList[nIndex + 1] + (absoluteValList[nIndex] - valueInAbsolute); absoluteValList[nIndex] = valueInAbsolute; } // L'anta modificata è l'ultima else if (dimensions.Count > 1) { absoluteValList[nIndex - 1] = absoluteValList[nIndex - 1] + (absoluteValList[nIndex] - valueInAbsolute); absoluteValList[nIndex] = valueInAbsolute; } } else { // L'anta modificata non è l'ultima if (nIndex < absoluteValList.Count - 1) { absoluteValList[nIndex + 1] = absoluteValList[nIndex + 1] - (valueInAbsolute - absoluteValList[nIndex]); absoluteValList[nIndex] = valueInAbsolute; } // L'anta modificata è l'ultima else if (dimensions.Count > 1) { absoluteValList[nIndex - 1] = absoluteValList[nIndex - 1] - (valueInAbsolute - absoluteValList[nIndex]); absoluteValList[nIndex] = valueInAbsolute; } } if (MeasureType.Equals(MeasureTypes.PROPORTIONAL)) m_dDimension = value; for (int i = 0; i < absoluteValList.Count; i++) { var item = dimensions.ElementAt(i); item.SetDimension(ad.ConvertIn(adList, absoluteValList[i], (MeasureTypes)item.SelMeasureTypeIndex, dimensionTot)); } } for (int i = 0; i < m_Parent.AreaList.Count; i++) { if (m_Parent.SplitHorizList.Count > 0 && i < m_Parent.SplitHorizList.Count) { List dimList = new List(); foreach (var itemDim in m_Parent.SplitHorizList) dimList.Add(new AreaDimension(itemDim.dDimension, itemDim.MeasureType, itemDim.Parent)); SplitDimension currSplitDim = m_Parent.SplitHorizList[i]; double dim = currSplitDim.dDimension; if (!(currSplitDim.MeasureType.Equals(MeasureTypes.ABSOLUTE))) dim = currSplitDim.ConvertDimension(dimList, currSplitDim.MeasureType, MeasureTypes.ABSOLUTE, height, -1); m_Parent.AreaList.ElementAt(i).SearchAreaList(m_Parent.AreaList.ElementAt(i), dim, "Height"); } if (m_Parent.SplitVertList.Count > 0 && i < m_Parent.SplitVertList.Count) { List dimList = new List(); foreach (var itemDim in m_Parent.SplitVertList) dimList.Add(new AreaDimension(itemDim.dDimension, itemDim.MeasureType, itemDim.Parent)); SplitDimension currSplitDim = m_Parent.SplitVertList[i]; double dim = currSplitDim.dDimension; if (!(currSplitDim.MeasureType.Equals(MeasureTypes.ABSOLUTE))) dim = currSplitDim.ConvertDimension(dimList, currSplitDim.MeasureType, MeasureTypes.ABSOLUTE, width, -1); m_Parent.AreaList.ElementAt(i).SearchAreaList(m_Parent.AreaList.ElementAt(i), dim, "Width"); } } } } } public Split Parent { get { return m_Parent; } set { m_Parent = value; } } public override int SelMeasureTypeIndex { get { return (int)m_SelMeasureType; } set { if (m_SelMeasureType != (MeasureTypes)value) { MeasureTypes newType = (MeasureTypes)value; List splitList = new List(); List splitElemList = new List(); if(m_Parent.ParentWindow.AreaList.FirstOrDefault() != null) { Frame frame = m_Parent.ParentWindow.AreaList.FirstOrDefault()!; double dimSplitGroup = 0; if (bIsVertListDim) { splitList = m_Parent.SplitVertList; splitElemList = m_Parent.ElemDimVertList; dimSplitGroup = CalculateWidthSplitGroup(frame, frame.AvailWidthArea(), new AreaFound(-1, false)).m_Dimension; } else { splitList = m_Parent.SplitHorizList; splitElemList = m_Parent.ElemDimHorizList; dimSplitGroup = (CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false))).m_Dimension; } AreaDimension ad = new AreaDimension(dDimension, SelMeasureType, Parent); List adList = new List(); foreach (var it in splitList) { adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType, it.Parent)); } foreach (var item in splitElemList) { dimSplitGroup = dimSplitGroup - item.dDimension; } m_dDimension = ad.ConvertDimension(adList, m_SelMeasureType, newType, dimSplitGroup, splitList.IndexOf(this)); m_SelMeasureType = (MeasureTypes)value; } } } } #endregion Public Properties #region Public Methods public SplitDimension Copy() { SplitDimension newSplitDim = new SplitDimension(dDimension, MeasureType, bIsRelative, m_Parent, bIsVertListDim); return newSplitDim; } #endregion Public Methods #region Internal Methods /// /// Metodo per calcolare larghezza intero split group /// /// area di partenza /// larghezza di partenza /// area di ritorno /// internal AreaFound CalculateWidthSplitGroup(Area area, double width, AreaFound res) { for (int i = 0; i < area.AreaList.Count; i++) { if (area.Equals(m_Parent)) { res.m_Dimension = width; res.m_Found = true; return res; } Area item = area.AreaList[i]; if (area is Split split) { if(split.SplitVertList.Count > 0) { int index = i; double widthGlass = width; foreach (var elem in split.ElemDimVertList) widthGlass = widthGlass - elem.dDimension; if (split.SelSplitShape is SplitShapes.GRID) index = i % split.SplitHorizList.Count; switch (split.SplitVertList.ElementAt(index).SelMeasureType) { case MeasureTypes.ABSOLUTE: { res = CalculateWidthSplitGroup(item, split.SplitVertList.ElementAt(index).dDimension, res); break; } case MeasureTypes.PROPORTIONAL: { AreaDimension ad = new AreaDimension(split.SplitVertList.ElementAt(index).dDimension, split.SplitVertList.ElementAt(index).SelMeasureType, split.SplitVertList.ElementAt(index).Parent); List adList = new List(); foreach (var it in split.SplitVertList) { adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType, it.Parent)); } res = CalculateWidthSplitGroup(item, ad.ConvertFromPropVal(adList, MeasureTypes.ABSOLUTE, widthGlass), res); break; } case MeasureTypes.PERCENTAGE: { res = CalculateWidthSplitGroup(item, split.SplitVertList.ElementAt(index).dDimension * widthGlass / 100, res); break; } } if (res.m_Dimension != -1 && res.m_Found) return res; } else { res = CalculateWidthSplitGroup(item, width, res); if (res.m_Dimension != -1 && res.m_Found) return res; } } else if (area is Sash sash) { double widthTot = width; double dim = 0; if (sash.ParentArea.ParentArea is Split) widthTot = widthTot + sash.SashList.ElementAt(i).ElementDimensionList.ElementAt(1).dOverlap + sash.SashList.ElementAt(i).ElementDimensionList.Last().dOverlap; if (sash.bIsDimensionLight) { widthTot = widthTot - sash.SashList.First().ElementDimensionList.ElementAt(1).dDimension - sash.SashList.First().ElementDimensionList.Last().dDimension; for (int anta = 1; anta < sash.SashList.Count; anta++) { widthTot = widthTot - sash.SashList.ElementAt(anta).ElementDimensionList.ElementAt(1).dDimension - sash.SashList.ElementAt(anta).ElementDimensionList.Last().dDimension + sash.SashList.ElementAt(anta).ElementDimensionList.Last().dOverlap; } } else { for (int anta = 1; anta < sash.SashList.Count; anta++) { widthTot = widthTot + sash.SashList.ElementAt(anta).ElementDimensionList.Last().dOverlap; } } switch (sash.SashList.ElementAt(i).SelMeasureType) { case MeasureTypes.ABSOLUTE: { dim = sash.SashList.ElementAt(i).dDimension; break; } case MeasureTypes.PROPORTIONAL: { AreaDimension ad = new AreaDimension(sash.SashList.ElementAt(i).dDimension, sash.SashList.ElementAt(i).SelMeasureType, sash.SashList.ElementAt(i).Parent); List adList = new List(); foreach (var it in sash.SashList) adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType, it.Parent)); dim = ad.ConvertFromPropVal(adList, MeasureTypes.ABSOLUTE, widthTot); break; } case MeasureTypes.PERCENTAGE: { dim = sash.SashList.ElementAt(i).dDimension * widthTot / 100; break; } } if (!sash.bIsDimensionLight) dim = dim - sash.SashList.ElementAt(i).ElementDimensionList.ElementAt(1).dDimension - sash.SashList.ElementAt(i).ElementDimensionList.Last().dDimension; res = CalculateWidthSplitGroup(item, dim, res); if (res.m_Dimension != -1 && res.m_Found) return res; } else { res = CalculateWidthSplitGroup(item, width, res); if (res.m_Dimension != -1 && res.m_Found) return res; } } return res; } /// /// Metodo per calcolare altezza intero split group /// /// area di partenza /// altezza di partenza /// area di ritorno /// internal AreaFound CalculateHeightSplitGroup(Area area, double height, AreaFound res) { for (int i = 0; i < area.AreaList.Count; i++) { if (area.Equals(m_Parent)) { res.m_Dimension = height; res.m_Found = true; return res; } Area item = area.AreaList[i]; if (area is Split split) { if (split.SplitHorizList.Count > 0) { double dim = height; int index = i; if (split.SelSplitShape is SplitShapes.GRID) index = i % split.SplitHorizList.Count; switch (split.SplitHorizList.ElementAt(index).SelMeasureType) { case MeasureTypes.ABSOLUTE: { dim = split.SplitHorizList.ElementAt(index).dDimension; break; } case MeasureTypes.PROPORTIONAL: { double heigthGlass = 0; AreaDimension ad = new AreaDimension(split.SplitHorizList.ElementAt(index).dDimension, split.SplitHorizList.ElementAt(index).SelMeasureType, split.SplitHorizList.ElementAt(index).Parent); List adList = new List(); foreach (var it in split.SplitHorizList) adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType, it.Parent)); foreach (var elem in split.ElemDimHorizList) heigthGlass = heigthGlass - elem.dDimension; dim = ad.ConvertFromPropVal(adList, MeasureTypes.ABSOLUTE, heigthGlass); break; } case MeasureTypes.PERCENTAGE: { foreach(var elem in split.ElemDimHorizList) dim = dim - elem.dDimension; dim = split.SplitHorizList.ElementAt(index).dDimension * dim / 100; break; } } //if (split.ParentArea is Frame frame && split.AreaList.ElementAt(i).AreaList.First() is Sash sash) //{ // dim = dim + sash.SashList.First().ElementDimensionList.First().dOverlap // + sash.SashList.First().ElementDimensionList.ElementAt(sash.SashList.First().ElementDimensionList.Count - 2).dOverlap; //} res = CalculateHeightSplitGroup(item, dim, res); if (res.m_Dimension != -1 && res.m_Found) return res; } else { double dim = height; //if (split.ParentArea is Frame frame && split.AreaList.ElementAt(i).AreaList.First() is Sash sash) //{ // dim = dim + sash.SashList.First().ElementDimensionList.First().dOverlap // + sash.SashList.First().ElementDimensionList.ElementAt(sash.SashList.First().ElementDimensionList.Count - 2).dOverlap; //} res = CalculateHeightSplitGroup(item, dim, res); if (res.m_Dimension != -1 && res.m_Found) return res; } } else if (area is Sash sash) { double bottomRail = 0; if(sash.SashBottomRailQty > 0) { foreach (var bottom in sash.BottomRailElemDimList) bottomRail = bottomRail + bottom.dDimension - bottom.dOverlap; } double dim = height - sash.SashList.First().ElementDimensionList.First().dDimension - sash.SashList.First().ElementDimensionList.ElementAt(sash.SashList.First().ElementDimensionList.Count - 2).dDimension - bottomRail; res = CalculateHeightSplitGroup(item, dim, res); if (res.m_Dimension != -1 && res.m_Found) return res; } else if (area is Splitted splitted) { double dim = height; if (splitted.ParentArea is Split sp && splitted.AreaList.First() is Sash sh) { if (sp.SplitHorizList.Count > 0) { dim = dim + sh.SashList.First().ElementDimensionList.First().dOverlap + sh.SashList.First().ElementDimensionList.ElementAt(sh.SashList.First().ElementDimensionList.Count - 2).dOverlap; } } res = CalculateHeightSplitGroup(item, dim, res); if (res.m_Dimension != -1 && res.m_Found) return res; } else { res = CalculateHeightSplitGroup(item, height, res); if (res.m_Dimension != -1 && res.m_Found) return res; } } return res; } internal JsonSplitDimension Serialize() { JsonSplitDimension JsonSplitDimension = new JsonSplitDimension(m_bIsRelative, m_dDimension, MeasureType); return JsonSplitDimension; } internal void SetIsRelative(bool value) { m_bIsRelative = value; } internal void SetIsVertListDim(bool value) { m_bIsVertListDim = value; } internal void SetMeasureType(MeasureTypes value) { m_SelMeasureType = value; } internal void SetSelMeasureType(MeasureTypes value) { if (m_SelMeasureType != (MeasureTypes)value) { MeasureTypes newType = (MeasureTypes)value; List splitList = new List(); List splitElemList = new List(); if (m_Parent.ParentWindow.AreaList.FirstOrDefault() != null) { Frame frame = m_Parent.ParentWindow.AreaList.FirstOrDefault()!; double dimSplitGroup = 0; if (bIsVertListDim) { splitList = m_Parent.SplitVertList; splitElemList = m_Parent.ElemDimVertList; dimSplitGroup = CalculateWidthSplitGroup(frame, frame.AvailWidthArea(), new AreaFound(-1, false)).m_Dimension; } else { splitList = m_Parent.SplitHorizList; splitElemList = m_Parent.ElemDimHorizList; dimSplitGroup = (CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false))).m_Dimension; } AreaDimension ad = new AreaDimension(dDimension, SelMeasureType, Parent); List adList = new List(); foreach (var it in splitList) { adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType, it.Parent)); } foreach (var item in splitElemList) { dimSplitGroup = dimSplitGroup - item.dDimension; } m_dDimension = ad.ConvertDimension(adList, m_SelMeasureType, newType, dimSplitGroup, splitList.IndexOf(this)); m_SelMeasureType = (MeasureTypes)value; } } } #endregion Internal Methods #region Private Fields private bool m_bIsRelative = false; private bool m_bIsVertListDim = false; // reference private Split m_Parent; #endregion Private Fields } public class AreaFound { public AreaFound(double dimension, bool found) { m_Dimension = dimension; m_Found = found; } public double m_Dimension { get; set; } = -1; public bool m_Found { get; set; } = false; } }