using WebWindowComplex.Json; using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models { public class Split : Area { #region Public Constructors public Split(Area ParentArea, Window ParentWindow) : base(ParentArea, ParentWindow) { } #endregion Public Constructors #region Public Properties public bool bSplitStartVert { get { return m_bSplitStartVert; } set { if(m_bSplitStartVert != value) { m_bSplitStartVert = value; List elemVertListOld = new List(m_ElemDimVertList); List elemHorizListOld = new List(m_ElemDimHorizList); m_ElemDimVertList.Clear(); m_ElemDimHorizList.Clear(); double thickness = SetThickness(); if (value) { for (int i = 0; i < nSplitQtyVert; i++) { SplitElementDimension newVertElem = elemVertListOld.Where(x => x.nSubArea == 1 && x.nIndex == i + 1).First().Copy(); newVertElem.SetElement(i + 1, thickness, 0); m_ElemDimVertList.Add(newVertElem); //m_ElemDimVertList.Add(new SplitElementDimension(this, i + 1, thickness, 0)); } for (int subArea = 0; subArea < m_SplitVertList.Count; subArea++) { for (int index = 0; index < nSplitQtyHoriz; index++) { SplitElementDimension newHorizElem = elemHorizListOld.Where(x => x.nIndex == index + 1).First().Copy(); newHorizElem.SetElement(index + 1, thickness, subArea + 1); m_ElemDimHorizList.Add(newHorizElem); //m_ElemDimHorizList.Add(new SplitElementDimension(this, index + 1, thickness, subArea + 1)); } } } else { for (int i = 0; i < nSplitQtyHoriz; i++) { SplitElementDimension newHorizElem = elemHorizListOld.Where(x => x.nSubArea == 1 && x.nIndex == i + 1).First().Copy(); newHorizElem.SetElement(i + 1, thickness, 0); m_ElemDimHorizList.Add(newHorizElem); //m_ElemDimHorizList.Add(new SplitElementDimension(this, i + 1, thickness, 0)); } for (int subArea = 0; subArea < m_SplitHorizList.Count; subArea++) { for (int index = 0; index < nSplitQtyVert; index++) { SplitElementDimension newVertElem = elemVertListOld.Where(x => x.nIndex == index + 1).First().Copy(); newVertElem.SetElement(index + 1, thickness, subArea + 1); m_ElemDimVertList.Add(newVertElem); //m_ElemDimVertList.Add(new SplitElementDimension(this, index + 1, thickness, subArea + 1)); } } } } } } public virtual int nSplitQtyHoriz { get { return m_SplitHorizList.Count > 0 ? m_SplitHorizList.Count - 1 : 0; } set { if(value >= 0 && value < 6) { if (value == 0) { for (var SplitIndex = m_SplitHorizList.Count - 1; SplitIndex >= value; SplitIndex += -1) m_SplitHorizList.RemoveAt(SplitIndex); if (nSplitQtyVert == 0) { ParentArea.AreaList.Remove(this); Fill newFill = Fill.CreateFill(ParentArea, FillTypes.GLASS); newFill.SetAreaType(AreaTypes.FILL); ParentArea.AreaList.Add(newFill); } else { ElemDimHorizList.RemoveAt(0); SetSplitShape(SplitShapes.VERTICAL); SetSplitStartVert(true); // Controllo quanti split orizzontali ci sono int nVert = m_SplitVertList.Count > 0 ? m_SplitVertList.Count : 1; // Cancello aree di troppo for (var SplitIndex = nVert; SplitIndex <= AreaList.Count; SplitIndex++) AreaList.RemoveAt(AreaList.Count - 1); } } else { Frame? frame = ParentWindow.AreaList.FirstOrDefault(); if(frame != null) { double heightTot = CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false)).m_Dimension; //double heightTot = SplitHorizList.First().CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false)).m_Dimension; // Ricalcolo dimensioni aggiungendo split if (value > m_SplitHorizList.Count - 1) { // recupero larghezza ultimo double dLastDimension = heightTot; double dNewDimension = heightTot; if (m_SplitHorizList.Count > 0) { dLastDimension = m_SplitHorizList[m_SplitHorizList.Count - 1].dDimension; if(m_SplitHorizList.Last().MeasureType is MeasureTypes.ABSOLUTE) dNewDimension = (dLastDimension - m_ElemDimHorizList.Last().dDimension) / (value + 1 - nSplitQtyHoriz); else dNewDimension = dLastDimension / (value + 1 - nSplitQtyHoriz); if (m_SplitHorizList[m_SplitHorizList.Count - 1].MeasureType.Equals(MeasureTypes.PROPORTIONAL)) dNewDimension = 1; m_SplitHorizList[m_SplitHorizList.Count - 1].SetDimension(dNewDimension); } else dNewDimension = dLastDimension / (value + 1 - nSplitQtyHoriz); // aggiungo area Split di default for (var SplitIndex = m_SplitHorizList.Count; SplitIndex <= value; SplitIndex++) m_SplitHorizList.Add(new SplitDimension(dNewDimension, m_SplitHorizList[m_SplitHorizList.Count - 1].MeasureType, true, this, false)); double thickness = SetThickness(); if (!m_bSplitStartVert) { //Aggiungo un elemento alla sottoarea principale SplitElementDimension newElemDim = ElemDimHorizList.First().Copy(); newElemDim.SetElement(ElemDimHorizList.Max(x => x.nIndex) + 1, thickness, 0); ElemDimHorizList.Add(newElemDim); //ElemDimHorizList.Add(new SplitElementDimension(this, ElemDimHorizList.Max(x => x.nIndex) + 1, 78, 0)); if (nSplitQtyVert > 0) { // Aggiungo a tutte le sottoaree degli element int subArea = ElemDimVertList.Max(x => x.nSubArea) + 1; for (int i = 1; i <= ElemDimVertList.Max(x => x.nIndex); i++) { newElemDim = ElemDimVertList.First().Copy(); newElemDim.SetElement(i, thickness, subArea); ElemDimVertList.Add(newElemDim); //ElemDimVertList.Add(new SplitElementDimension(this, i, 78, subArea)); } } } else { // Aggiungo a tutte le sottoaree degli element for (int i = 1; i <= ElemDimHorizList.Max(x => x.nSubArea); i++) { int index = ElemDimHorizList.Where(x => x.nSubArea == i).Max(x => x.nIndex); SplitElementDimension newElemDim = ElemDimVertList.First().Copy(); newElemDim.SetElement(index + 1, thickness, i); ElemDimHorizList.Insert(index * i + (i - 1), newElemDim); //ElemDimHorizList.Insert(index * i + (i - 1), new SplitElementDimension(this, index + 1, thickness, i)); } } } // Ricalcolo dimensioni rimuovendo split else { int countProportional = m_SplitHorizList.Count(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)); if (m_SplitHorizList.Last().MeasureType.Equals(MeasureTypes.PROPORTIONAL) && countProportional - 1 == 1) { m_SplitHorizList.RemoveAt(m_SplitVertList.Count() - 1); m_SplitHorizList.Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)).FirstOrDefault()?.SetDimension(1); } else { double dLastDimension = 0; for (var SplitIndex = m_SplitHorizList.Count - 1; SplitIndex >= value + 1; SplitIndex += -1) { dLastDimension += m_SplitHorizList[SplitIndex].dDimension; if (m_SplitHorizList.Last().MeasureType.Equals(MeasureTypes.ABSOLUTE)) dLastDimension += m_ElemDimHorizList[SplitIndex - 1].dDimension; m_SplitHorizList.RemoveAt(SplitIndex); } dLastDimension += m_SplitHorizList[m_SplitHorizList.Count - 1].dDimension; m_SplitHorizList[m_SplitHorizList.Count - 1].SetDimension(dLastDimension); } if (m_bSplitStartVert) { // Rimuovo da tutte le sottoaree degli element l'ultimo elemento for (int subArea = 1; subArea <= ElemDimHorizList.Max(x => x.nSubArea); subArea++) { SplitElementDimension? removeElem = ElemDimHorizList.Where(x => x.nSubArea == subArea).OrderByDescending(x => x.nIndex).FirstOrDefault(); if(removeElem != null) ElemDimHorizList.Remove(removeElem); } } else { int deleteSubArea = ElemDimHorizList.Count + 1; for (var SplitIndex = ElemDimHorizList.Count - 1; SplitIndex >= value; SplitIndex += -1) { ElemDimHorizList.RemoveAt(ElemDimHorizList.Count - 1); } if(nSplitQtyVert > 0) ElemDimVertList.RemoveAll(x => x.nSubArea == deleteSubArea); } } // Controllo quanti split verticali ci sono int nVert = m_SplitVertList.Count > 0 ? m_SplitVertList.Count : 1; // Se aggiungo split devo aggiungere vetro nell'area splitted aggiunta for (var SplitIndex = AreaList.Count; SplitIndex <= (m_SplitHorizList.Count * nVert) - 1; SplitIndex++) { AreaList.Add(Splitted.CreateSplitted(this)); Fill newFill = Fill.CreateFill(AreaList[SplitIndex], FillTypes.GLASS); newFill.SetAreaType(AreaTypes.FILL); AreaList[AreaList.Count - 1].AreaList.Add(newFill); } // Se ho più di uno split, elimino l'ultimo if (AreaList.Count > 2) { int nAreaList = AreaList.Count - 1; for (var SplitIndex = (m_SplitHorizList.Count * nVert); SplitIndex <= nAreaList; SplitIndex++) { AreaList.Remove(AreaList[AreaList.Count - 1]); } } // Se elimino l'unico split presente else { Splitted s = (Splitted)AreaList[0]; s.SetParentArea(ParentArea); ParentArea.AreaList.Add(s); ParentArea.AreaList.Remove(this); } } } } //UpdateSubAreaSplit(); } } public virtual int nSplitQtyVert { get { return m_SplitVertList.Count > 0 ? m_SplitVertList.Count - 1 : 0; } set { if (value >= 0 && value < 6) { if (value == 0) { for (var SplitIndex = m_SplitVertList.Count - 1; SplitIndex >= value; SplitIndex += -1) m_SplitVertList.RemoveAt(SplitIndex); if (nSplitQtyHoriz == 0) { ParentArea.AreaList.Remove(this); Fill newFill = Fill.CreateFill(ParentArea, FillTypes.GLASS); newFill.SetAreaType(AreaTypes.FILL); ParentArea.AreaList.Add(newFill); } else { ElemDimVertList.RemoveAt(0); SetSplitShape(SplitShapes.HORIZONTAL); SetSplitStartVert(false); // Controllo quanti split orizzontali ci sono int nHoriz = m_SplitHorizList.Count > 0 ? m_SplitHorizList.Count : 1; // Cancello aree di troppo for (var SplitIndex = nHoriz; SplitIndex <= AreaList.Count; SplitIndex++) AreaList.RemoveAt(AreaList.Count-1); } } else { Frame? frame = ParentWindow.AreaList.FirstOrDefault(); if (frame != null) { double widthTot = CalculateWidthSplitGroup(frame, frame.AvailWidthArea(), new AreaFound(-1, false)).m_Dimension; //double widthTot = CalculateWidthArea(frame, frame.AvailWidthArea()); // Ricalcolo dimensioni aggiungendo split if (value > m_SplitVertList.Count - 1) { // recupero larghezza ultimo double dLastDimension = widthTot; double dNewDimension = widthTot; if (m_SplitVertList.Count > 0) { dLastDimension = m_SplitVertList[m_SplitVertList.Count - 1].dDimension; if (m_SplitVertList.Last().MeasureType is MeasureTypes.ABSOLUTE) dNewDimension = (dLastDimension - ElemDimVertList.Last().dDimension) / (value + 1 - nSplitQtyVert); else dNewDimension = dLastDimension / (value + 1 - nSplitQtyVert); if (m_SplitVertList[m_SplitVertList.Count - 1].MeasureType.Equals(MeasureTypes.PROPORTIONAL)) dNewDimension = 1; m_SplitVertList[m_SplitVertList.Count - 1].SetDimension(dNewDimension); } else dNewDimension = dLastDimension / (value + 1 - nSplitQtyVert); // aggiungo area Split di default for (var SplitIndex = m_SplitVertList.Count; SplitIndex <= value; SplitIndex++) m_SplitVertList.Add(new SplitDimension(dNewDimension, m_SplitVertList[m_SplitVertList.Count - 1].MeasureType, true, this, true)); double thickness = SetThickness(); if (m_bSplitStartVert) { //Aggiungo un elemento alla sottoarea principale SplitElementDimension newElemDim = ElemDimVertList.First().Copy(); newElemDim.SetElement(ElemDimVertList.Max(x => x.nIndex) + 1, thickness, 0); ElemDimVertList.Add(newElemDim); //ElemDimVertList.Add(new SplitElementDimension(this, ElemDimVertList.Max(x => x.nIndex) + 1, 78, 0)); if (nSplitQtyHoriz > 0) { // Aggiungo a tutte le sottoaree degli element int subArea = ElemDimHorizList.Max(x => x.nSubArea) + 1; for (int i = 1; i <= ElemDimHorizList.Max(x => x.nIndex); i++) { newElemDim = ElemDimHorizList.First().Copy(); newElemDim.SetElement(i, thickness, subArea); ElemDimHorizList.Add(newElemDim); //ElemDimHorizList.Add(new SplitElementDimension(this, i, 78, subArea)); } } } else { // Aggiungo a tutte le sottoaree un elemento for (int i = 1; i <= ElemDimVertList.Max(x => x.nSubArea); i++) { int index = ElemDimVertList.Where(x => x.nSubArea == i).Max(x => x.nIndex); SplitElementDimension newElemDim = ElemDimVertList.First().Copy(); newElemDim.SetElement(index + 1, thickness, i); ElemDimVertList.Insert(index * i + (i - 1), newElemDim); //ElemDimVertList.Insert(index * i + (i - 1), new SplitElementDimension(this, index + 1, 78, i)); } } } else if (value == 0) { m_SplitVertList.RemoveAt(1); m_SplitVertList.RemoveAt(0); } // Ricalcolo dimensioni rimuovendo split else { int countProportional = m_SplitVertList.Count(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)); if(m_SplitVertList.Last().MeasureType.Equals(MeasureTypes.PROPORTIONAL) && countProportional - 1 == 1) { m_SplitVertList.RemoveAt(m_SplitVertList.Count() - 1); m_SplitVertList.Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)).FirstOrDefault()?.SetDimension(1); } else { double dLastDimension = 0; for (var SplitIndex = m_SplitVertList.Count - 1; SplitIndex >= value + 1; SplitIndex += -1) { dLastDimension += m_SplitVertList[SplitIndex].dDimension; if(m_SplitVertList.Last().MeasureType.Equals(MeasureTypes.ABSOLUTE)) dLastDimension += ElemDimVertList[SplitIndex - 1].dDimension; m_SplitVertList.RemoveAt(SplitIndex); } dLastDimension += m_SplitVertList[m_SplitVertList.Count - 1].dDimension; m_SplitVertList[m_SplitVertList.Count - 1].SetDimension(dLastDimension); } if (m_bSplitStartVert) { int deleteSubArea = ElemDimVertList.Count + 1; for (var SplitIndex = ElemDimVertList.Count - 1; SplitIndex >= value; SplitIndex += -1) { ElemDimVertList.RemoveAt(ElemDimVertList.Count - 1); } if(nSplitQtyHoriz > 0) ElemDimHorizList.RemoveAll(x=>x.nSubArea == deleteSubArea); } else { // Rimuovo da tutte le sottoaree degli element l'ultimo elemento for (int subArea = 1; subArea <= ElemDimVertList.Max(x => x.nSubArea); subArea++) { SplitElementDimension removeElem = ElemDimVertList.Where(x => x.nSubArea == subArea).OrderByDescending(x => x.nIndex).FirstOrDefault(); ElemDimVertList.Remove(removeElem); } } } // Controllo quanti split orizzontali ci sono int nHoriz = m_SplitHorizList.Count > 0 ? m_SplitHorizList.Count : 1; // Se aggiungo split devo aggiungere vetro nell'area splitted aggiunta for (var SplitIndex = AreaList.Count; SplitIndex <= (m_SplitVertList.Count * nHoriz) - 1; SplitIndex++) { AreaList.Add(Splitted.CreateSplitted(this)); Fill newFill = Fill.CreateFill(AreaList[SplitIndex], FillTypes.GLASS); newFill.SetAreaType(AreaTypes.FILL); AreaList[AreaList.Count - 1].AreaList.Add(newFill); } // Se ho più di uno split, elimino l'ultimo if (AreaList.Count > 2) { int nAreaList = AreaList.Count - 1; for (var SplitIndex = (m_SplitVertList.Count * nHoriz); SplitIndex <= nAreaList; SplitIndex++) { AreaList.Remove(AreaList[AreaList.Count - 1]); } } // Se elimino l'unico split presente else { Splitted s = (Splitted)AreaList[0]; s.SetParentArea(ParentArea); ParentArea.AreaList.Add(s); ParentArea.AreaList.Remove(this); } } } //UpdateSubAreaSplit(); } } } public virtual int SelSplitShapeIndex { get { return (int)m_SelSplitShape; } set { SplitShapes OldSelShapeSplit = m_SelSplitShape; m_SelSplitShape = (SplitShapes)value; // Azzero quantità orizzontale e verticale SetSplitQtyVert(0, 0); SetSplitQtyHoriz(0, 0); if (m_SelSplitShape == SplitShapes.VERTICAL) { // Inserisco valori di default SetSplitStartVert(true); SetSplitQtyVert(1, 0); } else if (m_SelSplitShape == SplitShapes.HORIZONTAL) { // Inserisco valori di default SetSplitStartVert(false); SetSplitQtyHoriz(1, 0); } else { // Inserisco valori di default SetSplitStartVert(true); SetSplitQtyVert(1, 1); SetSplitQtyHoriz(1, 1); } if(OldSelShapeSplit == SplitShapes.GRID || m_SelSplitShape == SplitShapes.GRID) { // Cancello vecchio contenuto dello split AreaList.Clear(); // Aggiungo area Splitted e vetro int nVert = m_SplitVertList.Count > 0 ? m_SplitVertList.Count : 1; int nHoriz = m_SplitHorizList.Count > 0 ? m_SplitHorizList.Count : 1; for (var SplitIndex = 0; SplitIndex <= (nVert * nHoriz) - 1; SplitIndex++) { AreaList.Add(Splitted.CreateSplitted(this)); Fill newFill = Fill.CreateFill(AreaList[SplitIndex], FillTypes.GLASS); newFill.SetAreaType(AreaTypes.FILL); AreaList[SplitIndex].AreaList.Add(newFill); } } UpdateSubAreaSplit(); } } public List SplitHorizList { get { return m_SplitHorizList; } set { m_SplitHorizList = value; } } public List ElemDimHorizList { get { return m_ElemDimHorizList; } set { m_ElemDimHorizList = value; } } public List ElemDimVertList { get { return m_ElemDimVertList; } set { m_ElemDimVertList = value; } } public List SplitShapeList { get { return m_SplitShapeList; } } public List SplitVertList { get { return m_SplitVertList; } set { m_SplitVertList = value; } } #endregion Public Properties #region Public Methods public override Split Copy(Area newParentArea) { Split newSplit = new Split(newParentArea, ParentWindow); AddCounterGroup(); newSplit.SetGroupId(nCounterGroup); newSplit.SetSplitStartVert(bSplitStartVert); for (int i = 0; i < SplitVertList.Count; i++) newSplit.SplitVertList.Add(SplitVertList[i].Copy()); for (int i = 0; i < SplitHorizList.Count; i++) newSplit.SplitHorizList.Add(SplitHorizList[i].Copy()); newSplit.SetSplitShape(SelSplitShape); newSplit.SetAreaType(AreaType); foreach (var item in ElemDimHorizList) { SplitElementDimension newElementDimension = item.Copy(); newSplit.ElemDimHorizList.Add(newElementDimension); } foreach (var item in ElemDimVertList) { SplitElementDimension newElementDimension = item.Copy(); newSplit.ElemDimVertList.Add(newElementDimension); } foreach (var item in AreaList) { Area a = item.Copy(newSplit); newSplit.AreaList.Add(a); } return newSplit; } public void Remove() { ParentArea.AreaList.Remove(this); if(!(ParentArea is Fill)) { Fill newFill = Fill.CreateFill(ParentArea, FillTypes.GLASS); newFill.SetAreaType(AreaTypes.FILL); ParentArea.AreaList.Add(newFill); } } public List searchElemFromSubArea(int subArea) { if(subArea == 0) { if (m_bSplitStartVert) return m_ElemDimVertList; else return m_ElemDimHorizList; } else { if (m_bSplitStartVert) return m_ElemDimHorizList.Where(x => x.nSubArea == subArea).ToList(); else return m_ElemDimVertList.Where(x => x.nSubArea == subArea).ToList(); } } #endregion Public Methods #region Internal Properties internal SplitShapes SelSplitShape { get { return m_SelSplitShape; } set { m_SelSplitShape = value; } } #endregion Internal Properties #region Internal Methods internal static Split CreateSplit(Area Area, SplitShapes SplitShape) { Split Split = new Split(Area, Area.ParentWindow); AddCounterGroup(); Split.SetGroupId(nCounterGroup); Split.SetAreaType(AreaTypes.SPLIT); Split.SetSplitShape(SplitShape); return Split; } /// /// 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) { if (area.Equals(this)) { res.m_Dimension = height; res.m_Found = true; return res; } for (int i = 0; i < area.AreaList.Count; i++) { Area item = area.AreaList[i]; if (area is Split split) { if (split.SplitHorizList.Count > 0) { double dim = height; foreach (var elem in split.ElemDimHorizList) dim = dim - elem.dDimension; 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: { 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)); dim = ad.ConvertFromPropVal(adList, MeasureTypes.ABSOLUTE, dim); break; } case MeasureTypes.PERCENTAGE: { dim = split.SplitHorizList.ElementAt(index).dDimension * dim / 100; break; } } res = CalculateHeightSplitGroup(item, dim, res); if (res.m_Dimension != -1 && res.m_Found) return res; } else { double dim = height; 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; } /// /// 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) { if (area.Equals(this)) { res.m_Dimension = width; res.m_Found = true; return res; } for (int i = 0; i < area.AreaList.Count; i++) { Area item = area.AreaList[i]; if (area is Split split) { if (split.SplitVertList.Count > 0) { int index = i; double dim = width; foreach (var elem in split.ElemDimVertList) dim = dim - 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, dim), res); break; } case MeasureTypes.PERCENTAGE: { res = CalculateWidthSplitGroup(item, split.SplitVertList.ElementAt(index).dDimension * dim / 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; } internal override JsonArea Serialize(bool hideHw) { if (nCounterGroup < GroupId) Area.nCounterGroup = GroupId; JsonSplit JsonSplit = new JsonSplit(m_SelSplitShape, GroupId); JsonSplit.SplitStartVert = bSplitStartVert; foreach (var SplitVert in m_SplitVertList) JsonSplit.SplitVertList.Add(SplitVert.Serialize()); foreach (var SplitHoriz in m_SplitHorizList) JsonSplit.SplitHorizList.Add(SplitHoriz.Serialize()); if(m_ElemDimHorizList != null && m_ElemDimHorizList.Count > 0) { int subAreaMinHoriz = m_ElemDimHorizList.Min(x => x.nSubArea); List horizList = m_ElemDimHorizList.Where(x => x.nSubArea == subAreaMinHoriz).ToList(); foreach (var Elem in horizList) JsonSplit.ElementDimHorizList.Add(Elem.Serialize()); } if (m_ElemDimVertList != null && m_ElemDimVertList.Count > 0) { int subAreaMinVert = m_ElemDimVertList.Min(x => x.nSubArea); List vertList = m_ElemDimVertList.Where(x => x.nSubArea == subAreaMinVert).ToList(); foreach (var Elem in vertList.ToList()) JsonSplit.ElementDimVertList.Add(Elem.Serialize()); } foreach (var Area in AreaList) JsonSplit.AreaList.Add(Area.Serialize(hideHw)); return JsonSplit; } internal void SetSplitQtyHoriz(int QtyHoriz, int QtyVert) { if (QtyHoriz > m_SplitHorizList.Count) { // recupero larghezza ultimo double dLastDimension = 100; double dNewDimension = 100; if (m_SplitHorizList.Count > 0) { dLastDimension = m_SplitHorizList[m_SplitHorizList.Count - 1].dDimension; dNewDimension = dLastDimension / (QtyHoriz + 1 - nSplitQtyHoriz); m_SplitHorizList[m_SplitHorizList.Count - 1].dDimension = dNewDimension; } else dNewDimension = dLastDimension / (QtyHoriz + 1 - nSplitQtyHoriz); // aggiungo area Split di default for (var SplitIndex = m_SplitHorizList.Count; SplitIndex <= QtyHoriz; SplitIndex++) m_SplitHorizList.Add(new SplitDimension(dNewDimension, MeasureTypes.PERCENTAGE, true, this, false)); } else if (QtyHoriz < m_SplitHorizList.Count) { for (var SplitIndex = m_SplitHorizList.Count - 1; SplitIndex >= QtyHoriz; SplitIndex += -1) m_SplitHorizList.RemoveAt(SplitIndex); } if(QtyHoriz == 0) { ElemDimHorizList.Clear(); } else { double thickness = SetThickness(); // Un Elemento per ogni dimensione principale e per ogni sotto dimensione if (bSplitStartVert) { for (int subArea = 0; subArea <= QtyVert; subArea++) { for (int i = 0; i < QtyHoriz; i++) ElemDimHorizList.Add(new SplitElementDimension(this, i + 1, thickness, subArea + 1)); } } else { for (int i = 0; i < QtyHoriz; i++) ElemDimHorizList.Add(new SplitElementDimension(this, i + 1, thickness, 0)); } } } internal void SetSplitQtyVert(int QtyVert, int QtyHoriz) { if (QtyVert > m_SplitVertList.Count) { // recupero larghezza ultimo double dLastDimension = 100; double dNewDimension = 100; if (m_SplitVertList.Count > 0) { dLastDimension = m_SplitVertList[m_SplitVertList.Count - 1].dDimension; dNewDimension = dLastDimension / (QtyVert + 1 - nSplitQtyVert); m_SplitVertList[m_SplitVertList.Count - 1].dDimension = dNewDimension; } else dNewDimension = dLastDimension / (QtyVert + 1 - nSplitQtyVert); // aggiungo area Split di default for (var SplitIndex = m_SplitVertList.Count; SplitIndex <= QtyVert; SplitIndex++) m_SplitVertList.Add(new SplitDimension(dNewDimension, MeasureTypes.PERCENTAGE, true, this, true)); } else if (QtyVert < m_SplitVertList.Count) { for (var SplitIndex = m_SplitVertList.Count - 1; SplitIndex >= QtyVert; SplitIndex += -1) m_SplitVertList.RemoveAt(SplitIndex); } if (QtyVert == 0) { ElemDimVertList.Clear(); } else { double thickness = SetThickness(); // Un Elemento per ogni dimensione principale e per ogni sotto dimensione if (bSplitStartVert) { for (int i = 0; i < QtyVert; i++) ElemDimVertList.Add(new SplitElementDimension(this, i + 1, thickness, 0)); } else { for (int subArea = 0; subArea <= QtyHoriz; subArea++) { for (int i = 0; i < QtyVert; i++) ElemDimVertList.Add(new SplitElementDimension(this, i + 1, thickness, subArea + 1)); } } } } internal virtual double SetThickness() { double thickness = 78; if (ParentArea is Sash || ParentArea.ParentArea is Sash) thickness = Window.m_ParameterList.GetValueOrDefault("Sash_Sash_Split_DimStd"); return thickness; } internal void SetSplitShape(SplitShapes Value) { m_SelSplitShape = Value; } internal void SetSplitStartVert(bool SplitStartVert) { m_bSplitStartVert = SplitStartVert; } internal void UpdateSubAreaSplit() { if (SplitHorizList.Count > 0) { for (int i = 0; i < AreaList.Count; i++) { if (i < SplitHorizList.Count) { SplitDimension currSplitDim = SplitHorizList[i]; List dimList = new List(); foreach (var itemDim in SplitHorizList) dimList.Add(new AreaDimension(itemDim.dDimension, itemDim.MeasureType, itemDim.Parent)); double dim = currSplitDim.dDimension; double height = 0; if (!(currSplitDim.MeasureType.Equals(MeasureTypes.ABSOLUTE))) { Frame frame = ParentArea.ParentWindow.AreaList[0]; if (frame != null) { height = CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false)).m_Dimension; //height = currSplitDim.CalculateHeightSplitGroup(frame, frame.AvailHeightArea(), new AreaFound(-1, false)).m_Dimension; } foreach (var elem in ElemDimHorizList) height = height - elem.dDimension; dim = currSplitDim.ConvertDimension(dimList, currSplitDim.MeasureType, MeasureTypes.ABSOLUTE, height, -1); } AreaList.ElementAt(i).SearchAreaList(AreaList.ElementAt(i), dim, "Height"); } } } if (SplitVertList.Count > 0) { for (int i = 0; i < AreaList.Count; i++) { if (i < SplitVertList.Count) { SplitDimension currSplitDim = SplitVertList[i]; List dimList = new List(); foreach (var itemDim in SplitVertList) dimList.Add(new AreaDimension(itemDim.dDimension, itemDim.MeasureType, itemDim.Parent)); double dim = currSplitDim.dDimension; double width = 0; if (!(currSplitDim.MeasureType.Equals(MeasureTypes.ABSOLUTE))) { Frame frame = ParentArea.ParentWindow.AreaList[0]; if(frame != null) { width = CalculateWidthSplitGroup(frame, frame.AvailWidthArea(), new AreaFound(-1, false)).m_Dimension; //width = currSplitDim.CalculateWidthSplitGroup(frame, frame.AvailWidthArea(), new AreaFound(-1, false)).m_Dimension; } foreach (var elem in ElemDimVertList) width = width - elem.dDimension; dim = currSplitDim.ConvertDimension(dimList, currSplitDim.MeasureType, MeasureTypes.ABSOLUTE, width, -1); } AreaList.ElementAt(i).SearchAreaList(AreaList.ElementAt(i), dim, "Width"); } } } } #endregion Internal Methods #region Private Fields private bool m_bSplitStartVert = true; private SplitShapes m_SelSplitShape; private List m_SplitHorizList = new List(); private List m_ElemDimHorizList = new List(); private List m_ElemDimVertList = new List(); private List m_SplitShapeList = new List { new IdNameStruct((int)SplitShapes.VERTICAL, "Vertical"), new IdNameStruct((int)SplitShapes.HORIZONTAL, "Horizontal"), new IdNameStruct((int)SplitShapes.GRID, "Grid"), new IdNameStruct((int)SplitShapes.CUSTOM, "Custom") }; private List m_SplitVertList = new List(); #endregion Private Fields } }