using System.ComponentModel.Design; using WebWindowTest.Json; using static WebWindowTest.Json.WindowConst; namespace WebWindowTest.Models { public abstract class Area { #region Public Constructors public Area(Area ParentArea, Window ParentWindow) { m_ParentWindow = ParentWindow; m_ParentArea = ParentArea; } #endregion Public Constructors #region Public Properties public static int nCounterGroup { get => m_CounterGroup; set => m_CounterGroup = value; } public List AreaList { get { return m_AreaList; } set { m_AreaList = value; } } public AreaTypes AreaType { get { return m_AreaType; } set { m_AreaType = value; } } public int GroupId { get { return m_GroupId; } set { m_GroupId = value; } } public int nAreaId { get { return m_nAreaId; } set { m_nAreaId = value; } } public Area ParentArea { get { return m_ParentArea; } } public Window ParentWindow { get { return m_ParentWindow; } } #endregion Public Properties #region Public Methods public static void AddCounterGroup() { m_CounterGroup++; } public void AddFirstSash() { // Salvo il parent Area ParentArea = AreaList[0].ParentArea; // Creo area sash di default Sash SashArea = Sash.CreateSash(ParentArea); // Inserisco famiglia hardware vuota SashArea.SetSelFamilyHardware(""); // Inserisco hardware di default SashArea.SetSelHardwareFromId("000000"); //if (ParentWindow.AreaList.First().SelShapeIndex == (int)Shapes.ARC || // ParentWindow.AreaList.First().SelShapeIndex == (int)Shapes.DOUBLEARC || // ParentWindow.AreaList.First().SelShapeIndex == (int)Shapes.ARC_FULL || // ParentWindow.AreaList.First().SelShapeIndex == (int)Shapes.THREECENTERARC) // SashArea.SashArcElem = new SashArcElement(SashArea, ParentWindow, 10, true); //else // SashArea.SashArcElem = null; // Salvo gli oggetti già presenti e li cancello da AreaList List ContentArea = new List(); ContentArea.Add(AreaList[0]); AreaList.Remove(AreaList[0]); // Aggiungo area AreaList.Add(SashArea); // Inserisco il riempimento precedente AreaList[0].AreaList.Add(ContentArea[0]); AreaList[0].AreaList[0].SetParentArea(AreaList[0]); } public void AddSplit() { // Salvo il parent Area ParentArea = AreaList[0].ParentArea; List ContentArea = new List(); // Salvo gli oggetti già presenti e li cancello da AreaList ContentArea.Add(AreaList[0]); AreaList.Remove(AreaList[0]); // Aggiungo Area split di default Split SplitArea = Split.CreateSplit(this, SplitShapes.HORIZONTAL); // imposto i parametri di default SplitArea.SetSplitQtyHoriz(1); SplitArea.SetSplitStartVert(false); // Aggiungo area AreaList.Add(SplitArea); // Creo le due aree Splitted List newSplittedList = new List(); for (int i = 0; i < 2; i++) newSplittedList.Add(Splitted.CreateSplitted(SplitArea)); // Inserisco nelle aree Splitted Fill e la struttura precedente (e setto ParentArea del fill) ContentArea[0].SetParentArea(newSplittedList[1]); newSplittedList[1].AreaList.Add(ContentArea[0]); if (ContentArea[0] is Fill) { Fill fill1 = (Fill)ContentArea[0]; Fill fill2 = Fill.CreateFill(newSplittedList[0], fill1.FillType); newSplittedList[0].AreaList.Add(fill2); } else { Fill fill2 = Fill.CreateFill(newSplittedList[0], FillTypes.GLASS); newSplittedList[0].AreaList.Add(fill2); } // All'area Split aggiunto le due aree Splitted for (int i = 0; i < 2; i++) AreaList[0].AreaList.Add(newSplittedList[i]); } public abstract Area Copy(Area ParentArea); public void SetGroupId(int nGroupId) { m_GroupId = nGroupId; } public void SwapAree() { Area tempArea; if (this is Sash || this is Split) { tempArea = AreaList[0]; AreaList[0] = AreaList[1]; AreaList[1] = tempArea; } Frame frame = ParentWindow.AreaList.First(); switch (frame.Shape) { case Shapes.RECTANGLE: case Shapes.ARC_FULL: case Shapes.TRIANGLE: { SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Width")).First().dDimension, "Width"); SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Height")).First().dDimension, "Height"); break; } case Shapes.RIGHTCHAMFER: { SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Width")).First().dDimension, "Width"); SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Left Height")).First().dDimension, "Left Height"); break; } case Shapes.LEFTCHAMFER: { SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Width")).First().dDimension, "Width"); SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Right Height")).First().dDimension, "Right Height"); break; } case Shapes.DOUBLECHAMFER: case Shapes.ARC: { SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Width")).First().dDimension, "Width"); SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Full Height")).First().dDimension, "Full Height"); break; } case Shapes.DOUBLEARC: { SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Width")).First().dDimension, "Width"); SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Full Height")).First().dDimension, "Full Height"); break; } case Shapes.THREECENTERARC: { SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Width")).First().dDimension, "Width"); SearchAreaList(this, frame.DimensionList.Where(x => x.sName.Equals("Full Height")).First().dDimension, "Full Height"); break; } } } /// /// Cerca nell'albero gli oggetti Sash e Split per associare la larghezza /// /// public void SearchAreaList(Area node, double dim, string nameDim) { if (node != null) { if (node.AreaType.Equals(AreaTypes.SASH)) UpdateDimSubArea((Sash)node, dim, nameDim); else if (node.AreaType.Equals(AreaTypes.SPLIT)) UpdateDimSubArea((Split)node, dim, nameDim); for (int i = 0; i < node.AreaList.Count; i++) { if (node.AreaType.Equals(AreaTypes.SASH)) { Sash s = (Sash)node; List dimList = new List(); foreach (var item in s.SashList) dimList.Add(new AreaDimension(item.dDimension, item.MeasureType)); if(nameDim.Equals("Width")) SearchAreaList(node.AreaList.ElementAt(i), s.SashList.ElementAt(i).CalculateAbsoluteValue(dimList, dim), nameDim); else SearchAreaList(node.AreaList.ElementAt(i), dim, nameDim); } else if (node.AreaType.Equals(AreaTypes.SPLIT)) { Split s = (Split)node; List dimList = new List(); if (s.SplitHorizList.Count > 0 && i < s.SplitHorizList.Count) { foreach (var item in s.SplitHorizList) dimList.Add(new AreaDimension(item.dDimension, item.MeasureType)); if(nameDim.Equals("Width")) SearchAreaList(node.AreaList.ElementAt(i), dim, nameDim); else SearchAreaList(node.AreaList.ElementAt(i), s.SplitHorizList.ElementAt(i).CalculateAbsoluteValue(dimList, dim), nameDim); } if (s.SplitVertList.Count > 0 && i < s.SplitVertList.Count) { foreach (var item in s.SplitVertList) dimList.Add(new AreaDimension(item.dDimension, item.MeasureType)); if(nameDim.Equals("Width")) SearchAreaList(node.AreaList.ElementAt(i), s.SplitVertList.ElementAt(i).CalculateAbsoluteValue(dimList, dim), nameDim); else SearchAreaList(node.AreaList.ElementAt(i), dim, nameDim); } } else SearchAreaList(node.AreaList.ElementAt(i), dim, nameDim); } } } public void UpdateDimSubArea(Area area, double dim, string nameDim) { if (area is Sash && nameDim.Equals("Width")) { Sash sash = (Sash)area; int countAbsolute = sash.SashList.Where(x => x.MeasureType.Equals(MeasureTypes.ABSOLUTE)).Count(); int countProportional = sash.SashList.Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)).Count(); int countPercentage = sash.SashList.Where(x => x.MeasureType.Equals(MeasureTypes.PERCENTAGE)).Count(); List dimList = new List(); Split split = new Split(null, null); if (sash.ParentArea.ParentArea is Split) split = (Split)sash.ParentArea.ParentArea; if (sash.ParentArea is Frame || (sash.ParentArea.ParentArea is Split && split.SplitHorizList.Count > 0)) { Frame frame = new Frame(null, null); if(split.SplitHorizList.Count > 0) frame = (Frame)sash.ParentArea.ParentArea.ParentArea; else frame = (Frame)sash.ParentArea; foreach (var i in frame.DimensionList) dimList.Add(new AreaDimension(i.dDimension, i.SelMeasureType)); } else { //Split s = (Split)sash.ParentArea.ParentArea; foreach (var i in split.SplitVertList) dimList.Add(new AreaDimension(i.dDimension, i.SelMeasureType)); } if (countAbsolute == sash.SashList.Count) { double sum = sash.SashList.Sum(x => x.dDimension); double res = dim - sum; if (res > 0) { foreach (var sashDim in sash.SashList) { sashDim.SetDimension(sashDim.dDimension + res / countAbsolute); } } else { foreach (var sashDim in sash.SashList) { // Sommo perchè res è negativo sashDim.SetDimension(sashDim.dDimension + res / countAbsolute); } } } else if (countAbsolute < sash.SashList.Count && countPercentage != sash.SashList.Count && countProportional != sash.SashList.Count) { if (countPercentage > 0 && countPercentage <= sash.SashList.Count && countProportional == 0) { double sumAbsolute = sash.SashList.Where(x => x.MeasureType.Equals(MeasureTypes.ABSOLUTE)).Sum(x => x.dDimension); var percentageList = sash.SashList.Where(x => x.MeasureType.Equals(MeasureTypes.PERCENTAGE)).ToList(); foreach (var i in percentageList) { i.SetDimension(i.ConvertIn(dimList, (dim - sumAbsolute) / countPercentage, i.MeasureType, dim)); } } } } else if (area is Split) { Split split = (Split)area; List splitList = new List(); if (nameDim.Equals("Width")) splitList = split.SplitVertList; else splitList = split.SplitHorizList; int countAbsolute = splitList.Where(x => x.MeasureType.Equals(MeasureTypes.ABSOLUTE)).Count(); if (countAbsolute != 0 && countAbsolute == splitList.Count) { double sum = splitList.Sum(x => x.dDimension); double res = 0; res = dim - sum; if (res > 0) { foreach (var item in splitList) { item.SetDimension(item.dDimension + res / countAbsolute); } } else { foreach (var item in splitList) { // Sommo perchè res è negativo item.SetDimension(item.dDimension + res / countAbsolute); } } } } } #endregion Public Methods #region Internal Methods internal abstract JsonArea Serialize(bool hideHw); internal void SetAreaType(AreaTypes AreaType) { m_AreaType = AreaType; } internal void SetParentArea(Area ParentArea) { m_ParentArea = ParentArea; } /// /// Metodo per convertire da misura proporzionale a misura assoluta o percentuale /// /// /// internal double ConvertFromPropVal(Sash sashGroup, double sashDim, MeasureTypes newType, double widthTot) { double tot = widthTot; List adList = new List(); foreach (var it in sashGroup.SashList) { adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType)); } //Somma misura non proporzionali double sumNotProp = sashGroup.SashList .Where(m => m.MeasureType != MeasureTypes.PROPORTIONAL && !m.Equals(this)) .Sum(m => m.CalculateAbsoluteValue(adList, tot)); //Calcolo residuo double res = tot - sumNotProp; if (res < 0) res = 0; //Misure proporzionali var proportionalList = sashGroup.SashList .Where(m => m.SelMeasureType == MeasureTypes.PROPORTIONAL) .ToList(); double sumPesi = proportionalList.Sum(p => p.dDimension); if (sumPesi == 0) sumPesi = 1; if (newType.Equals(MeasureTypes.ABSOLUTE)) { return res / sumPesi * sashDim; } else { return (res / sumPesi * sashDim) / tot * 100; } } /// /// Metodo per convertire da misura proporzionale a misura assoluta o percentuale /// /// /// internal double ConvertFromPropVal(List splitList, double splitDim, MeasureTypes newType, double widthTot) { double tot = widthTot; List adList = new List(); foreach (var it in splitList) { adList.Add(new AreaDimension(it.dDimension, it.SelMeasureType)); } //Somma misura non proporzionali double sumNotProp = splitList .Where(m => m.MeasureType != MeasureTypes.PROPORTIONAL && !m.Equals(this)) .Sum(m => m.CalculateAbsoluteValue(adList, tot)); //Calcolo residuo double res = tot - sumNotProp; if (res < 0) res = 0; //Misure proporzionali var proportionalList = splitList .Where(m => m.SelMeasureType == MeasureTypes.PROPORTIONAL) .ToList(); double sumPesi = proportionalList.Sum(p => p.dDimension); if (sumPesi == 0) sumPesi = 1; return res / sumPesi * splitDim; } /// /// Metodo per calcolare larghezza area /// /// area di partenza /// larghezza di partenza /// public double CalculateWidthArea(Area area, double width) { for (int i = 0; i < area.AreaList.Count; i++) { double risultato = -1; if (area.Equals(this)) return width; Area item = area.AreaList[i]; if (area is Split) { Split split = (Split)area; if (split.SplitVertList.Count > 0) { switch (split.SplitVertList.ElementAt(i).SelMeasureType) { case MeasureTypes.ABSOLUTE: { risultato = CalculateWidthArea(item, split.SplitVertList.ElementAt(i).dDimension); break; } case MeasureTypes.PROPORTIONAL: { risultato = CalculateWidthArea(item, ConvertFromPropVal(split.SplitVertList, split.SplitVertList.ElementAt(i).dDimension, MeasureTypes.ABSOLUTE, width)); break; } case MeasureTypes.PERCENTAGE: { risultato = CalculateWidthArea(item, split.SplitVertList.ElementAt(i).dDimension * width / 100); break; } } } else { risultato = CalculateWidthArea(item, width); } if (risultato != -1) return risultato; } else if (area is Sash) { Sash sash = (Sash)area; switch (sash.SashList.ElementAt(i).SelMeasureType) { case MeasureTypes.ABSOLUTE: { risultato = CalculateWidthArea(item, sash.SashList.ElementAt(i).dDimension); break; } case MeasureTypes.PROPORTIONAL: { risultato = CalculateWidthArea(item, ConvertFromPropVal(sash, sash.SashList.ElementAt(i).dDimension, MeasureTypes.ABSOLUTE, width)); break; } case MeasureTypes.PERCENTAGE: { risultato = CalculateWidthArea(item, sash.SashList.ElementAt(i).dDimension * width / 100); break; } } if (risultato != -1) return risultato; } else { risultato = CalculateWidthArea(item, width); if (risultato != -1) return risultato; } } return width; } /// /// Metodo per calcolare larghezza area /// /// area di partenza /// altezza di partenza /// public double CalculateHeightArea(Area area, double height) { for (int i = 0; i < area.AreaList.Count; i++) { double risultato = -1; if (area.Equals(this)) return height; Area item = area.AreaList[i]; if (area is Split) { Split split = (Split)area; if (split.SplitHorizList.Count > 0) { switch (split.SplitHorizList.ElementAt(i).SelMeasureType) { case MeasureTypes.ABSOLUTE: { risultato = CalculateHeightArea(item, split.SplitHorizList.ElementAt(i).dDimension); break; } case MeasureTypes.PROPORTIONAL: { risultato = CalculateHeightArea(item, ConvertFromPropVal(split.SplitHorizList, split.SplitHorizList.ElementAt(i).dDimension, MeasureTypes.ABSOLUTE, height) ); break; } case MeasureTypes.PERCENTAGE: { risultato = CalculateHeightArea(item, split.SplitHorizList.ElementAt(i).dDimension * height / 100); break; } } } else { risultato = CalculateHeightArea(item, height); } if (risultato != -1) return risultato; } else if (area is Sash) { Sash sash = (Sash)area; switch (sash.SashList.ElementAt(i).SelMeasureType) { case MeasureTypes.ABSOLUTE: { risultato = CalculateHeightArea(item, sash.SashList.ElementAt(i).dDimension); break; } case MeasureTypes.PROPORTIONAL: { risultato = CalculateHeightArea(item, ConvertFromPropVal(sash, sash.SashList.ElementAt(i).dDimension, MeasureTypes.ABSOLUTE, height)); break; } case MeasureTypes.PERCENTAGE: { risultato = CalculateHeightArea(item, sash.SashList.ElementAt(i).dDimension * height / 100); break; } } if (risultato != -1) return risultato; } else { risultato = CalculateHeightArea(item, height); if (risultato != -1) return risultato; } } return height; } #endregion Internal Methods #region Protected Fields protected int m_nAreaId = -1; protected Window m_ParentWindow; #endregion Protected Fields #region Private Fields // Conteggio dei macro elementi private static int m_CounterGroup = 0; private List m_AreaList = new List(); private AreaTypes m_AreaType; private int m_GroupId; private Area m_ParentArea; #endregion Private Fields } }